There doesn’t seem to be a solution apart from the workaround I already described in the question. For future reference, if you want to fulfill (rather than resolve) a promise p
with a value val
, where val
is another promise, then just calling the promise resolution function for p
with argument val
won’t work as expected. It would cause p
to be “locked in” on the state of val
, such that p
will be fulfilled with val
‘s resolution value once val
is fulfilled (see spec).
Instead, wrap val
in another object and resolve p
with that object:
var resolveP; // Promise resolution function for p
var p = new Promise(
function(resolve, reject) {
resolveP = resolve;
}
);
function fulfillPwithPromise(val) { // Fulfills p with a promise val
resolveP({promise: val});
}
p.then(function(res) {
// Do something as soon as p is fulfilled...
return res.promise;
}).then(function(res) {
// Do something as soon as the second promise is fulfilled...
});
This solution works if you already know that val
is a promise. If you cannot make any assumptions about val
‘s type, then you seem to be out of luck. Either you have to always wrap promise resolution values in another object, or you can try to detect whether val
has a field then
of type “function” and wrap it conditionally.
That said, in some cases the default behavior of promise resolution may actually have the desired effect. So only use the workaround described above if you are sure that you want to fulfill instead of resolve the first promise with the second one.