相关疑难解决方法(0)

如何同步一系列承诺?

我有一个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.

后来我把它变成了一个供大家使用的共享库.

javascript promise

55
推荐指数
3
解决办法
5万
查看次数

异步Javascript执行是如何发生的?什么时候不使用return语句?

// 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语句?

有人可以对此有所了解吗?

javascript asynchronous return function execution

37
推荐指数
2
解决办法
2万
查看次数

单线程同步和异步混淆

假设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)

因为它是单线程.我不禁想象幕后真的发生了什么.

  1. 因此,当函数运行时,两个异步函数都将进入事件循环并立即console.log("READY")执行.
  2. 但是在console.log("READY")执行时,对于异步函数都没有真正的工作吗?由于单线程占用console.log 5秒.
  3. 在console.log完成之后.CPU将有时间在两个异步之间切换,以便每次都可以运行一些功能.

所以根据这个,该函数不一定会导致更快的执行,由于事件循环之间的切换,异步可能会更慢?我想,在一天结束时,一切都将在一个线程上传播,这将与同步版本相同?

我可能错过了一些非常大的概念,所以请让我知道.谢谢.

编辑 如果异步操作就像查询数据库等那么有意义.基本上,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)

asynchronous node.js

3
推荐指数
1
解决办法
735
查看次数

为什么回调函数允许我们在Javascript中异步执行操作?

我已经读过,回调会异步制作JavaScript.但我不确定我是否理解这个解释.这就是我得到的

回调函数允许我们异步执行操作,因为它们确保在加载下一行之前回调之前的行已完全完成.

真的吗?谢谢

javascript asynchronous callback language-concepts

0
推荐指数
1
解决办法
542
查看次数