mirror of
https://github.com/espruino/Espruino.git
synced 2025-12-08 19:06:15 +00:00
multiple then/catch
This commit is contained in:
parent
d9ca88ed35
commit
c7943a7e9d
@ -30,7 +30,7 @@ This is the built-in class for ES6 Promises
|
||||
|
||||
void jswrap_promise_resolve(JsVar *promise, JsVar *data) {
|
||||
JsVar *fn = jsvObjectGetChild(promise, JS_PROMISE_THEN_NAME, 0);
|
||||
jsvUnLock(jspeFunctionCall(fn, 0, promise, false, 1, &data));
|
||||
jsiExecuteEventCallback(promise, fn, 1, &data);
|
||||
jsvUnLock(fn);
|
||||
}
|
||||
void jswrap_promise_queueresolve(JsVar *promise, JsVar *data) {
|
||||
@ -43,7 +43,7 @@ void jswrap_promise_queueresolve(JsVar *promise, JsVar *data) {
|
||||
|
||||
void jswrap_promise_reject(JsVar *promise, JsVar *data) {
|
||||
JsVar *fn = jsvObjectGetChild(promise, JS_PROMISE_CATCH_NAME, 0);
|
||||
jsvUnLock(jspeFunctionCall(fn, 0, promise, false, 1, &data));
|
||||
jsiExecuteEventCallback(promise, fn, 1, &data);
|
||||
jsvUnLock(fn);
|
||||
}
|
||||
void jswrap_promise_queuereject(JsVar *promise, JsVar *data) {
|
||||
@ -103,6 +103,26 @@ JsVar *jswrap_promise_all(JsVar *arr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void _jswrap_promise_add(JsVar *parent, JsVar *callback, const char *name) {
|
||||
if (!jsvIsFunction(callback)) {
|
||||
jsExceptionHere(JSET_TYPEERROR, "Callback must be a function, got %t", callback);
|
||||
return;
|
||||
}
|
||||
JsVar *c = jsvObjectGetChild(parent, name, 0);
|
||||
if (!c) jsvObjectSetChild(parent, name, callback);
|
||||
else {
|
||||
if (jsvIsArray(c)) {
|
||||
jsvArrayPush(c, callback);
|
||||
} else {
|
||||
JsVar *fns[2] = {c,callback};
|
||||
JsVar *arr = jsvNewArray(fns, 2);
|
||||
jsvObjectSetChild(parent, name, arr);
|
||||
jsvUnLock(arr);
|
||||
}
|
||||
jsvUnLock(c);
|
||||
}
|
||||
}
|
||||
|
||||
/*JSON{
|
||||
"type" : "method",
|
||||
"class" : "Promise",
|
||||
@ -110,15 +130,13 @@ JsVar *jswrap_promise_all(JsVar *arr) {
|
||||
"generate" : "jswrap_promise_then",
|
||||
"params" : [
|
||||
["callback","JsVar","A callback that is called when this promise is resolved"]
|
||||
]
|
||||
],
|
||||
"return" : ["JsVar","The original Promise"]
|
||||
}
|
||||
*/
|
||||
void jswrap_promise_then(JsVar *parent, JsVar *callback) {
|
||||
if (!jsvIsFunction(callback)) {
|
||||
jsExceptionHere(JSET_TYPEERROR, "Callback must be a function, got %t", callback);
|
||||
return;
|
||||
}
|
||||
jsvObjectSetChild(parent, JS_PROMISE_THEN_NAME, callback);
|
||||
JsVar *jswrap_promise_then(JsVar *parent, JsVar *callback) {
|
||||
_jswrap_promise_add(parent, callback, JS_PROMISE_THEN_NAME);
|
||||
return jsvLockAgain(parent);
|
||||
}
|
||||
|
||||
/*JSON{
|
||||
@ -128,13 +146,11 @@ void jswrap_promise_then(JsVar *parent, JsVar *callback) {
|
||||
"generate" : "jswrap_promise_catch",
|
||||
"params" : [
|
||||
["callback","JsVar","A callback that is called when this promise is rejected"]
|
||||
]
|
||||
],
|
||||
"return" : ["JsVar","The original Promise"]
|
||||
}
|
||||
*/
|
||||
void jswrap_promise_catch(JsVar *parent, JsVar *callback) {
|
||||
if (!jsvIsFunction(callback)) {
|
||||
jsExceptionHere(JSET_TYPEERROR, "Callback must be a function, got %t", callback);
|
||||
return;
|
||||
}
|
||||
jsvObjectSetChild(parent, JS_PROMISE_CATCH_NAME, callback);
|
||||
JsVar *jswrap_promise_catch(JsVar *parent, JsVar *callback) {
|
||||
_jswrap_promise_add(parent, callback, JS_PROMISE_CATCH_NAME);
|
||||
return jsvLockAgain(parent);
|
||||
}
|
||||
|
||||
@ -15,5 +15,5 @@
|
||||
|
||||
JsVar *jswrap_promise_constructor(JsVar *executor);
|
||||
JsVar *jswrap_promise_all(JsVar *arr);
|
||||
void jswrap_promise_then(JsVar *parent, JsVar *callback);
|
||||
void jswrap_promise_catch(JsVar *parent, JsVar *callback);
|
||||
JsVar *jswrap_promise_then(JsVar *parent, JsVar *callback);
|
||||
JsVar *jswrap_promise_catch(JsVar *parent, JsVar *callback);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
var p = new Promise(function(res,rej) {
|
||||
setTimeout(res, 1000, "Hello");
|
||||
setTimeout(res, 10, "Hello");
|
||||
}).then(function(r) {
|
||||
console.log("resolve ",r);
|
||||
});
|
||||
@ -12,3 +12,18 @@ var p = new Promise(function(res,rej) {
|
||||
console.log("reject", r);
|
||||
});
|
||||
|
||||
var p = new Promise(function(res,rej) {
|
||||
setTimeout(res, 10, "Hello");
|
||||
}).then(function(r) {
|
||||
console.log("resolve ",r);
|
||||
});
|
||||
|
||||
var p = new Promise(function(res,rej) {
|
||||
setTimeout(res, 10, "Hello");
|
||||
}).then(function(r) {
|
||||
console.log("resolve 1",r);
|
||||
}).then(function(r) {
|
||||
console.log("resolve 2",r);
|
||||
});
|
||||
|
||||
trace(p);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user