ret = njs_function_call(vm, njs_function(&capability->resolve),
&njs_value_undefined, retval, 1, &vm->retval);
+ } else if (ret == NJS_AGAIN) {
+ ret = NJS_OK;
+
} else if (ret == NJS_ERROR) {
if (njs_is_memory_error(vm, &vm->retval)) {
return NJS_ERROR;
njs_async_context_free(vm, ctx);
+ } else if (ret == NJS_AGAIN) {
+ ret = NJS_OK;
+
} else if (ret == NJS_ERROR) {
if (njs_is_memory_error(vm, &vm->retval)) {
return NJS_ERROR;
"$r.subrequest('b')"
".then(select => cb($r, select))"),
njs_str("2") },
+
+ { njs_str("function pr(x) { return new Promise(resolve => {resolve(x + ':pr')}); };"
+ "Promise.all(['a', 'b', 'c'].map(async (v) => {"
+ " return await pr(v + ':async');"
+ "}))"
+ ".then(v => $r.retval(v))"),
+ njs_str("a:async:pr,b:async:pr,c:async:pr") },
+
+ { njs_str("function pr(x) { return new Promise(resolve => {resolve(x + ':pr')}); };"
+ "Promise.all(['a', 'b', 'c'].map(async (v) => {"
+ " let r = await pr(v + ':async');"
+ " let r2 = await pr(r + ':async2');"
+ " return r2 + ':r';"
+ "}))"
+ ".then(v => $r.retval(v))"),
+ njs_str("a:async:pr:async2:pr:r,b:async:pr:async2:pr:r,c:async:pr:async2:pr:r") },
};
--- /dev/null
+/*---
+includes: [compareArray.js]
+flags: [async]
+---*/
+
+let stages = [];
+
+function pr(x) { return new Promise(resolve => {resolve(x)}); }
+
+pr(10)
+.then(async (v) => {
+ stages.push("then before");
+ let y = await pr(22);
+ stages.push(`then ${v} ${y}`);
+ return v + y;
+})
+.then(v => stages.push(`then2 ${v}`))
+.catch(e => $DONOTEVALUATE())
+.then(v => assert.compareArray(stages, ['then before', 'then 10 22', 'then2 32']))
+.then($DONE, $DONE);