我有一个promise对象数组,必须按照它们在数组中列出的相同顺序进行解析,即我们不能尝试解析一个元素,直到前一个元素被解析(如方法所示Promise.all([...])).
如果一个元素被拒绝,我需要链接立即拒绝,而不尝试解析以下元素.
我该如何实现这个,或者是否存在这种sequence模式的现有实现?
function sequence(arr) {
return new Promise(function (resolve, reject) {
// try resolving all elements in 'arr',
// but strictly one after another;
});
}
Run Code Online (Sandbox Code Playgroud)
编辑
初始答案表明我们只能sequence得到这些数组元素的结果,而不是它们的执行结果,因为它是在这样的例子中预定义的.
但是,如何以避免早期执行的方式生成一系列承诺呢?
这是一个修改过的例子:
function sequence(nextPromise) {
// while nextPromise() creates and returns another promise,
// continue resolving it;
}
Run Code Online (Sandbox Code Playgroud)
我不想把它变成一个单独的问题,因为我认为它是同一个问题的一部分.
解
下面的一些答案和随后的讨论有点误入歧途,但最终解决方案完全符合我的要求,是在spex库中实现的,作为方法序列.该方法可以迭代一系列动态长度,并根据应用程序的业务逻辑创建promise.
后来我把它变成了一个供大家使用的共享库.
// synchronous Javascript
var result = db.get('select * from table1');
console.log('I am syncronous');
// asynchronous Javascript
db.get('select * from table1', function(result){
// do something with the result
});
console.log('I am asynchronous')
Run Code Online (Sandbox Code Playgroud)
我知道在同步代码中,console.log()在从db获取结果后执行,而在异步代码中,console.log()在db.get()获取结果之前执行.
现在我的问题是,异步代码的幕后执行是如何发生的,为什么它是非阻塞的?
我已经搜索了Ecmascript 5标准,以了解异步代码如何工作,但在整个标准中找不到异步这个词.
从nodebeginner.org我也发现我们不应该使用return语句,因为它阻止了事件循环.但是nodejs api和第三方模块在任何地方都包含return语句.那么什么时候应该使用return语句,何时不应该使用return语句?
有人可以对此有所了解吗?
假设makeBurger()需要10秒钟
在同步程序中,
function serveBurger() {
makeBurger();
makeBurger();
console.log("READY") // Assume takes 5 seconds to log.
}
Run Code Online (Sandbox Code Playgroud)
执行总共需要25秒.
因此,对于NodeJ,我们假设我们制作的异步版本makeBurgerAsync()也需要10秒钟.
function serveBurger() {
makeBurgerAsync(function(count) {
});
makeBurgerAsync(function(count) {
});
console.log("READY") // Assume takes 5 seconds to log.
}
Run Code Online (Sandbox Code Playgroud)
因为它是单线程.我不禁想象幕后真的发生了什么.
console.log("READY")执行.console.log("READY")执行时,对于异步函数都没有真正的工作吗?由于单线程占用console.log 5秒.所以根据这个,该函数不一定会导致更快的执行,由于事件循环之间的切换,异步可能会更慢?我想,在一天结束时,一切都将在一个线程上传播,这将与同步版本相同?
我可能错过了一些非常大的概念,所以请让我知道.谢谢.
编辑 如果异步操作就像查询数据库等那么有意义.基本上,nodejs会说"Hey DB会为我处理这个,而我会做其他事情".但是,我不理解的情况是nodejs本身内部的自定义回调函数.
EDIT2
function makeBurger() {
var count = 0;
count++; // 1 time
...
count++; // 999999 times
return count;
}
function makeBurgerAsync(callback) {
var count = …Run Code Online (Sandbox Code Playgroud) 我已经读过,回调会异步制作JavaScript.但我不确定我是否理解这个解释.这就是我得到的
回调函数允许我们异步执行操作,因为它们确保在加载下一行之前回调之前的行已完全完成.
真的吗?谢谢
asynchronous ×3
javascript ×3
callback ×1
execution ×1
function ×1
node.js ×1
promise ×1
return ×1