multiple then/catch

This commit is contained in:
Gordon Williams (u36) 2016-05-11 14:55:45 +01:00
parent d9ca88ed35
commit c7943a7e9d
3 changed files with 50 additions and 19 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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);