我努力实现承诺。(我想我理解它们,但是我经常得到意想不到的结果,所以也许我不知道。)
请考虑此代码。
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毕竟解决了Pro的问题,这实际上是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
问题:这是正确的课程吗?该语言无法识别Pro承诺在ap范围内的突出地位。“返回”足以离开发布者范围,但不能离开ap范围。“ resolve('ender')”足以解决承诺。在ender调用之后,执行链继续,这就是打印不需要的语句的原因。程序员必须既发送回调函数的承诺,并得到了封闭函数的范围了。
在正确的假设下,我编写了这段代码。
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的引用;它们会使人分心;我以为我需要它们来解决后续问题,但这第一次没有用,这使这篇文章简短了!):
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
它添加了递归,并在ender调用之后立即显示“ return”;它删除了lint识别出的无法访问的代码;一切都会顺利。
我有
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可以打印,是因为该语言无法识别所有可能性都被回调块中的“拒绝”或“解决”所覆盖。它继续执行不明智地放置在该位置的命令。
这些代码位是我仍然遇到问题的程序的模型。很快,我希望能够为其他令我惊讶的行为建模。
在更一般的层面上:初次接触Promises的人经常不了解Promises吗?我们如何有更高的信心来适当控制执行流程?在此详细级别上,哪些资源特别有用以进行解释?我会很感激在这个更一般的水平上的任何建议。
提前致谢 ...
这里真正的答案是拒绝和决心是简单的回调,并标记拒绝/诺言的决心。他们不修改原始JavaScript的工作方式,这是您的假设“我不希望在ender调用之后进行控制台调用,因为ender(//#2)毕竟解决了Promise,实际上这是所有ap范围;退出promise并退出ap也就不足为奇了。 ”
打电话reject
或resolve
简单地表示您将兑现承诺。这并不意味着您执行此操作的功能将立即退出。因此,请确定您是否要这样做return
。
下一个示例也是如此:
if (i < reps) {
cp(i, j)
.then(...)
console.log(... // you DON'T want this
}
是的,可以肯定的是,即使您不想要它也可以得到它。您创建了一个if
语句,您在其中做了一些Promise魔术,然后使用console.log
。因此,JavaScript不在乎它是否是Promise,它只是一个接一个地执行事情。
如果您阅读了更多有关Promises的内容,您将了解它们是纯JavaScript,并且try-catch
内部包含有Promises,因此,如果引发错误,则他们可以捕获该错误并调用失败回调(通常随一起提供.catch(function(err){})
)。
再次-承诺不会修改JavaScript的工作方式!您所说的一切都是非常合乎逻辑的,确实应该以这种方式发生。这是因为您希望Promises阻止您的其他代码,这根本不会发生:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句