对于 Promise 和协同例程,我在 NodeJs 中使用了 bluebird npm 包。
当 promise 多次得到解决时,有人可以帮助理解以下代码的行为吗?
问题:
当 Promise 多次解析时,协程会发生什么?
第二个产量是否会受到第一个产量倍数的影响?
const bluebird = require("bluebird");
function func1() { return new bluebird((resolve, reject) => { let c = 0; let iterval = SetInterval(() => { c++; let cc = c; console.log(`c=${c}`); if(cc === 20) { clearInterval(interval); } resolve(true); }, 1000); }); } let run1 = bluebird.coroutine(function*() { try { yield func1(); yield func1(); yield func1(); yield func1(); } catch (e) { console.dir(e); } });
最佳答案
什么也没有。
resolve
和reject
由 Promise 构造函数作为一对匿名函数发出。一旦其中一个被调用,对其中任何一个的进一步调用将被忽略。请注意,每次调用
func1
时都会调用新的间隔计时器,而不会停止之前启动的计时器,因此控制台输出看起来会很困惑。此外,每次调用
func1
都会返回一个不同的新 Promise。不,因为假设不正确。第一个yield不会多次yield,它返回一个在一秒后解决的promise。它位于生成器函数中,该函数在上一个yield(我上次检查时)之后的行处恢复。协程的作用是在前一个yield中返回的promise确定后调用生成器函数。请参阅http://bluebirdjs.com/docs/api/promise.coroutine.html了解更多详情。
关于javascript - 当 Promise 被多次解析且协程具有下一个 yield 时,协程将如何表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44179760/