Javascript 如果响应仍然悬而未决,承诺的价值是什么?
我遇到了一个编码挑战,这让我很困惑:Javascript 如果响应仍然悬而未决,承诺的价值是什么?,javascript,promise,Javascript,Promise,我遇到了一个编码挑战,这让我很困惑: function runMultipleQueries(queries) { var results = []; queries.forEach(doQuery); return results; function doQuery(query) { getData(query) .then(results.push.bind(results)); } } function log(value) { console
function runMultipleQueries(queries) {
var results = [];
queries.forEach(doQuery);
return results;
function doQuery(query) {
getData(query)
.then(results.push.bind(results));
}
}
function log(value) {
console.log(value);
}
runMultipleQueries(someArrayOfQueries).forEach(log);
编辑:假设这些函数都是在脚本的其他地方定义的
这个代码块的假设输出是什么?当承诺得到回报的时候,我被难住了,而与此同时又印了什么?我原以为我会看到一个未定义的数组,但现在我不确定
同时印刷的是什么?我想我会看到一系列未定义的
否。承诺尚未兑现,因此尚未执行任何推送操作,并且数组仍然为空。这就是为什么没有任何东西被打印出来,而且永远不会被打印出来
要打印某些内容,您需要打印,直到承诺兑现为止-或者单独打印(当每个结果可用时打印),或者全部打印(将结果放入数组中,然后打印)。对于后者,您不会自己推送它们,而是使用:
同时印刷的是什么?我想我会看到一系列未定义的
否。承诺尚未兑现,因此尚未执行任何推送操作,并且数组仍然为空。这就是为什么没有任何东西被打印出来,而且永远不会被打印出来
要打印某些内容,您需要打印,直到承诺兑现为止-或者单独打印(当每个结果可用时打印),或者全部打印(将结果放入数组中,然后打印)。对于后者,您不会自己推送它们,而是使用:
@Phil nested declarationsedit updated没有错,假设它们是在脚本“承诺返回时被难住”的其他地方定义的-不会从任何显示的函数中获取任何承诺
return
ed最终的forEach
将无事可做:返回的数组为空。如果响应仍处于挂起状态,承诺的值是多少?
如果承诺的状态为挂起,那就没有了value@Philnested declarationsedit updated没有错,假设它们是在脚本“承诺返回时被难住”的其他地方定义的-不会从任何显示的函数中获取任何承诺return
ed最终的forEach
将没有任何作用:返回的数组为空。如果响应仍处于挂起状态,承诺的值是多少?
如果承诺的状态为挂起,那么它就没有值OK帮助我理解,我认为promise充当占位符,并移动到下一行代码,直到它被解析(得到一个返回的对象)。我认为promise的意义在于,JavaScript不会阻塞线程,并等待某些东西被解析returned@HiYo不,承诺不是将被结果替换的占位符。这是包装纸。JS中没有线程。它是异步的,这意味着它总是立即转到下一行代码——当承诺稍后实现时,它将调用,然后调用回调。这会让普通代码“等待”。好吧,那么如果承诺稍后会实现,我们是否会跳过.then()并转到下一个迭代?很抱歉,我需要一步一步地理解这一点:(是的,确切地说,异步进程已经启动,使用安装处理程序,然后使用,并立即进入下一个迭代。好的,请帮助我理解,我认为承诺会充当占位符,并移动到下一行代码,直到解决它(获取返回的对象)我认为承诺的意义在于,JavaScript不会阻塞线程并等待某些事情发生returned@HiYo不,承诺不是将被结果替换的占位符。它是一个包装器。JS中没有线程。它是异步的,这意味着它总是立即移动到下一行代码——当承诺被替换时ts完成后,它将调用然后调用回调。这会使普通代码“等待”。好的,那么如果承诺稍后实现,我们是否跳过.then()并转到下一个迭代?很抱歉,我需要一步一步地理解这一点:(是的,确切地说,异步进程启动,使用安装处理程序,然后使用,并立即进入下一个迭代。
function runMultipleQueries(queries) {
return Promise.all(queries.map(getData));
}
function logArray(results) {
for (var value of results)
console.log(value));
}
runMultipleQueries(someArrayOfQueries).then(logArray);