如何在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
调用通常就在承诺创建的旁边。