如何在JavaScript中获取/演示异步行为

如何在JavaScript中获取/演示异步行为,javascript,node.js,asynchronous,ecmascript-6,Javascript,Node.js,Asynchronous,Ecmascript 6,我相信 承诺也确保了秩序的独立性。生产者与经营者分离 消费者,以便他们能够独立执行,是 异步编程。有了承诺,你就可以向一个 消费者在将解析器提供给生产者之前。然后他们可以生产 或者按照自己的时间表消费,承诺同步 为了理解上面描述的顺序独立性,我正在编写一些代码来演示这一点。基本上,我想创建两个异步承诺(基于在partA()和partB()中的两个不同时间下载两个图像),然后使用all解决这两个问题 var axios = require('axios'); function loadImage(

我相信

承诺也确保了秩序的独立性。生产者与经营者分离 消费者,以便他们能够独立执行,是 异步编程。有了承诺,你就可以向一个 消费者在将解析器提供给生产者之前。然后他们可以生产 或者按照自己的时间表消费,承诺同步

为了理解上面描述的顺序独立性,我正在编写一些代码来演示这一点。基本上,我想创建两个异步承诺(基于在
partA()
partB()
中的两个不同时间下载两个图像),然后使用
all
解决这两个问题

var axios = require('axios');
function loadImage(imgsrc) {
    return axios.get(imgsrc);
}
function partA() {
    var promise1 = loadImage("http://cn.bing.com/s/a/hp_zh_cn.png");
    var promise2 = setTimeout(partB,20000);
    Promise.all([promise1, promise2]).then(function() {
    console.log("The images are loaded");
    });
};

function partB () {
    return loadImage("http://cn.bing.com/s/a/hpc20.png");
};

partA();
以下是我的议题和问题:

  • 在执行最后一行中的
    partA()
    时,由于
    var promise2=setTimeout(partB,20000),我预计必须等待20秒才能看到成功消息行(为了便于说明,我希望两次下载间隔20秒)。也许我没有正确使用
    setTimeout
    。但无论如何,在
    babel节点
    REPL中调用partA()后,我几乎立即收到了成功消息。我怎样才能得到适当的延迟

  • 在本例中(如果正确),我如何解释订单独立性,即按照自己的计划生产或消费?生产和消费场所在哪里


  • (这是babel node 6.24.1的版本,在Ubuntu 16.04下带有预设es2015)

    问题是,setTimeout没有返回承诺。您必须插入一个承诺,该承诺对promise.all执行超时

    function partA() {
         var promise1 = loadImage("http://cn.bing.com/s/a/hp_zh_cn.png");
         var promise2 = new Promise((resolve, reject) => {
             setTimeout(() => {
                 return resolve(partB);
             }, 20000);
         });
         Promise.all([promise1, promise2]).then(function() {
             console.log("The images are loaded");
         });
     };
    
     function partB() {
         return loadImage("http://cn.bing.com/s/a/hpc20.png");
     };
    
     partA();
    

    在本例中,promise2实际上是一个承诺,它在20秒后与partB结果一起解决。

    问题是,setTimeout不返回承诺。您必须插入一个承诺,该承诺对promise.all执行超时

    function partA() {
         var promise1 = loadImage("http://cn.bing.com/s/a/hp_zh_cn.png");
         var promise2 = new Promise((resolve, reject) => {
             setTimeout(() => {
                 return resolve(partB);
             }, 20000);
         });
         Promise.all([promise1, promise2]).then(function() {
             console.log("The images are loaded");
         });
     };
    
     function partB() {
         return loadImage("http://cn.bing.com/s/a/hpc20.png");
     };
    
     partA();
    

    在本例中,promise2实际上是一个承诺,它在20秒后与partB结果进行解析。

    setTimeout
    不返回承诺

    <> P>在工作中查看订单独立性考虑这个例子:

    var promise1, promise2;
    promise1 = loadImage("http://cn.bing.com/s/a/hp_zh_cn.png");
    promise2 = loadImage("http://cn.bing.com/s/a/hpc20.png");
    promise1.then(function () {
        console.log("promise1 finished");
    });
    promise2.then(function () {
        console.log("promise2 finished");
    });
    Promise.all([promise1, promise2]).then(function() {
        console.log("both finished");
    });
    
    此脚本的输出可以是:

    promise1 finished
    promise2 finished
    both finished
    

    这取决于哪个请求提前完成。如果你想要一个更为可控的例子,考虑一下:

    var promise1, promise2;
    promise1 = create_timeout_promise(20);
    promise2 = create_timeout_promise(10);
    
    function create_timeout_promise(timeout) {
        var promise;
        promise = new Promise(function (resolve) {
            setTimeout(resolve, timeout);
        });
        return promise;
    }
    
    现在exepcted输出为:

    promise2 finished
    promise1 finished
    both finished
    

    因为承诺2将首先解析。

    setTimeout
    不会返回承诺

    <> P>在工作中查看订单独立性考虑这个例子:

    var promise1, promise2;
    promise1 = loadImage("http://cn.bing.com/s/a/hp_zh_cn.png");
    promise2 = loadImage("http://cn.bing.com/s/a/hpc20.png");
    promise1.then(function () {
        console.log("promise1 finished");
    });
    promise2.then(function () {
        console.log("promise2 finished");
    });
    Promise.all([promise1, promise2]).then(function() {
        console.log("both finished");
    });
    
    此脚本的输出可以是:

    promise1 finished
    promise2 finished
    both finished
    

    这取决于哪个请求提前完成。如果你想要一个更为可控的例子,考虑一下:

    var promise1, promise2;
    promise1 = create_timeout_promise(20);
    promise2 = create_timeout_promise(10);
    
    function create_timeout_promise(timeout) {
        var promise;
        promise = new Promise(function (resolve) {
            setTimeout(resolve, timeout);
        });
        return promise;
    }
    
    现在exepcted输出为:

    promise2 finished
    promise1 finished
    both finished
    

    因为promise 2将首先解析。

    setTimeout
    不返回承诺。
    setTimeout
    不返回承诺。谢谢。我测试了你的代码,它在大约4秒钟内返回消息。这会有所不同,但不是我预期的20秒。另外,您知道如果第二个承诺没有正确创建/传递,为什么我的代码会返回成功消息吗?这是一个
    承诺。所有不都要求数组中的所有承诺都要兑现吗?谢谢。我测试了你的代码,它在大约4秒钟内返回消息。这会有所不同,但不是我预期的20秒。另外,您知道如果第二个承诺没有正确创建/传递,为什么我的代码会返回成功消息吗?这是一个
    承诺。all
    这不要求数组中的所有承诺都要兑现吗?+1感谢您的详细回答。在编写我的测试时,我试图将生产者和消费者分开,方法是将
    then()
    尽可能远离
    newpromise()
    (可能在代码和时间上)。这是对分离的正确理解吗?我试图理解它们是如何独立的,因为在我目前看到的示例中,
    。然后
    调用通常就在承诺创建的旁边。+1感谢详细的答案。在编写我的测试时,我试图将生产者和消费者分开,方法是将
    then()
    尽可能远离
    newpromise()
    (可能在代码和时间上)。这是对分离的正确理解吗?我试图理解它们是如何分离和独立的,因为在我目前看到的示例中,
    .then
    调用通常就在承诺创建的旁边。