有关承诺的细节; 例子

我努力实现诺言。 (我我理解他们,但我经常得到意想不到的结果,所以也许我不会。)

请考虑这个代码。

function ap() { return new Promise(function(resolve, reject) { console.log('function ap starting want this'); function ender() { console.log('function ender starting want this'); return resolve('ender'); console.log('after return in ender don\'t want this'); //#1 } ender() console.log('after function ender and its resolve ' + 'for Promise don\'t want this'); //#2 }) // Promise } // ap console.log('---') ap() .then(function(result, error) { if (error) console.log ('error ' + error.message) console.log('function ap result result=' + result + ' want this') }) 

我已经包含了很多地方的console.log语句,并表明我是否希望他们打印,因为我对承诺的理解。

我期望:

 function ap starting want this function ender starting want this function ap result result=ender want this 

我不希望在ender(//#1)里面最后一次调用console.log,因为它足够让我退出ender范围。 我的棉绒声称是“无法达到的”; 听起来一致。

我不想在ender调用之后调用控制台(//#2),因为ender终究解决了几乎所有ap范围的Promise问题; 退出诺言并退出ap并不奇怪。

我有:

 function ap starting want this function ender starting want this after function ender and its resolve for Promise don't want this function ap result result=ender want this 

问:这是正确的教训吗? 该语言不承认在该范围内的承诺的显着性。 “返回”足以让范围,而不是范围。 “解决('恩德')”足以解决承诺。 ender调用之后继续执行链,这就是打印不需要的语句的原因。 程序员必须将callback函数发送给Promise, 退出封闭函数的范围。

按照这个假设进行,我写了这个代码。

 function bp() { return new Promise(function(resolve, reject) { console.log('function bp starting want this') function ender() { console.log('function ender starting want this'); return resolve('ender'); console.log('after return in ender don\'t want this'); } ender(); return; console.log('after function ender and its resolve ' + 'for Promise don\'t want this'); }) // Promise } // bp 

它不同于第一个代码,只是在ender调用之后立即添加了一个返回值。 通过ender的唯一途径包括“return resolve('ender')”; 如果我在ender调用之后立即添加“return”,它会让我脱离bp范围,一切都会好的。

考虑到一个不同的函数名称,我期望得到和以前预期一样的结果,并得到了这个结果。 看起来像我的“经验教训”可能接近正确的答案。

接下来我写了这段代码(请忽略对j的引用;它们是分心的;我认为我需要它们来解决后续问题,但是这并不是第一次,所以使这个post变短了):

 function cp(i, j) { return new Promise(function(resolve, reject) { console.log('function cp starting i=' + i + ' j=' + j + ' want this'); function ender() { console.log('function cp ender starting i=' + i + ' j=' + j + ' want this'); i++; let reps = 3; if (i < reps) { cp(i, j) .then(function(result, error) { if (error) { console.log('*** error i=' + i + ' j=' + j + ' msg=' + error.message + ' want this'); return reject(error); } console.log('in cp cp('+ i + ', ' + j + ') result=' + result + ' want this'); return resolve(result); }) // cp(i) callback console.log('in cp i=' + i + ' j=' + j + '' + ' in ender after reject, resolve, and ' + 'callback don\'t want this'); //#3 } // if (i < reps) console.log('in cp resolving i=' + i + ' j=' + j + ' want this') return resolve('done'); } // ender ender(); return; console.log('in cp i=' + i + ' j=' + j + ' after ender call and return for cp scope' + ' don\'t want this'); }) // Promise } // cp 

它增加了recursion,并立即跟着ender调用“return”; 它删除了linter标识的不可到达的代码; 一切都可能顺利。

我有

 function cp starting i=0 j=0 want this function cp ender starting i=0 j=0 want this function cp starting i=1 j=0 want this function cp ender starting i=1 j=0 want this function cp starting i=2 j=0 want this function cp ender starting i=2 j=0 want this in cp resolving i=3 j=0 want this in cp i=2 j=0 in ender after return, resolve, and callback don't want this in cp resolving i=2 j=0 want this in cp i=1 j=0 in ender after return, resolve, and callback don't want this in cp resolving i=1 j=0 want this in cp cp(2, 0) result=done want this in cp cp(1, 0) result=done want this function cp result result=done want this 

这是我期望得到的,除了#/ 3打印,因为语言不承认所有的可能性都被回收块中的“拒绝”或“解决”所覆盖; 它继续在那个位置不明智地执行命令。

这些代码位是我继续遇到的一个程序的模型。 不久,我希望能够模仿其他令我惊讶的行为。

在更普遍的层面上:有承诺的第一次使用者往往不了解承诺? 我们如何能够有更高的信心来适当地控制执行的stream程呢? 在这个细节层面,哪些资源特别有用? 我会感谢在这个更一般的层面上的任何build议。

提前致谢 …

这里的真正答案是拒绝解决 只是callback,并标志着一个承诺的拒绝/决心。 他们不修改原来的JavaScript工作方式,这是你的假设“ 我不想在ender调用之后调用控制台,因为ender(//#2)毕竟解决了Promise,几乎所有的ap范围;退出承诺并退出ap并不奇怪。

打电话rejectresolve只是意味着你将与这个承诺一起工作。 这并不意味着你这样做的function将立即退出。 所以当然如果你想这样做 – 使用return

这与你的下一个例子是一样的:

 if (i < reps) { cp(i, j) .then(...) console.log(... // you DON'T want this } 

那么是的,当然,尽pipe你不想要,你也会得到它。 你创build了一个if语句,在其中你做了一些Promise的魔术,然后使用console.log 。 所以JavaScript不关心它是否是Promise – 它只是一个接一个的执行。

如果你多读一点关于Promise的知识,你就会明白它们是纯粹的JavaScript,里面有一个try-catch ,所以如果抛出一个错误,他们可以捕获它并调用失败callback.catch(function(err){}) (通常用.catch(function(err){}) )。

再次 – 诺言不会修改JavaScript的工作方式! 而且你所说的一切都是非常合乎逻辑的,而且的确应该发生这样的事情。 这是因为你期望承诺阻止你的其他代码,这是不会发生的:)