我试图通过在本书的练习中创建promise.all方法来理解promise是如何工作的:https://eloquentjavascript.net/11_async.html#i_ug+dv9mmsw
我尝试遍历作为方法本身参数给出的整个数组,使用。然后对于成功的promise,处理程序的主体将结果推送到我以前在循环外定义的绑定,对于拒绝的promise,我使用。catch的方式是,它将拒绝的值作为“原因”,并拒绝主promise,从而导致错误
function Promise_all(promises) {
return new Promise((resolve, reject) => {
if(promises.length == 0) resolve(promises);
let fullArray = [];
for(let i=0; i<promises.length ; i++){
promises[i]
.then(x => fullArray.push(x))
.catch(reason => reject(new Error(reason)));
}
resolve(fullArray);
});
}
我希望函数执行以下操作:
-从“promise”数组中选择一个promise。
代码并不像我想象的那样工作,使用这本书的测试代码并不能返回预期的结果:
Promise_all([]).then(array => {
console.log("This should be []:", array);
});
function soon(val) {
return new Promise(resolve => {
setTimeout(() => resolve(val), Math.random() * 500);
});
}
Promise_all([soon(1), soon(2), soon(3)]).then(array => {
console.log("This should be [1, 2, 3]:", array);
});
Promise_all([soon(1), Promise.reject("X"), soon(3)])
.then(array => {
console.log("We should not get here");
})
.catch(error => {
if (error != "X") {
console.log("Unexpected failure:", error);
}
});
正如@bergi所说,代码的问题是“.then”和“.catch”回调是异步调用的,因此,当调用“resolve()”时,“fullarray”甚至没有被填充,即使它在循环之外。为了解决这个问题,我简单地在最后完成的promise中添加了“resolve()”,为此,我简单地添加了一个“counter”绑定,该绑定的值为“promises”数组的长度,每次都会减少1。然后在promise上调用“counter”,当这个“counter”等于0时,它调用“resolve()”。
但这只解决了用promise填充“fullarray”的问题,而不是这些promise按照它们被调用的顺序正确排序的问题,为了解决这个问题,我只是用循环的“i”绑定在数组中枚举它们,最终结果是:
function Promise_all(promises) {
return new Promise((resolve, reject) => {
if(promises.length == 0) resolve(promises);
let fullArray = [],
counter = promises.length;
for(let i=0; i< promises.length ; i++){
promises[i]
.then(x => {
fullArray[i] = x;
counter--;
if(counter == 0) resolve(fullArray)})
.catch(reason => reject(new Error(reason)));
}
});
}
这是我第一次尝试做出promise。我有一个工作的基本promise(从别人的代码中剽窃),但不知道如何调整它以使其有用。 到目前为止我所拥有的(在我的
在这一节中,我们正式的定义一个类。首先我给出PHP语言的实现: <?php class myclass { public $public_var; private $private_var; protected $protected_var; public static $static_var; public function __construct()
创建页面需要两步: 新建路由 新建vue页面 新建一个路由 路由文件是 src/router/index.js, 打开之后, 我们增加两行: import Vue from 'vue' import Router from 'vue-router' // 增加这一行, 作用是引入 SayHi 这个component import SayHi from '@/components/SayHi'
本文向大家介绍利用Promise自定义一个GET请求的函数示例代码,包括了利用Promise自定义一个GET请求的函数示例代码的使用技巧和注意事项,需要的朋友参考一下 写在最前面 近期 review 自己以前的代码的时候,看到 promise 的使用方法,用的比较模糊。含义不清,用法凌乱,这里重新温习一下基础知识。 前言 JavaScript 是单线程工作,但是浏览器是多线程的。为了更好的完成我们
我想在调用这个函数的时候 初始化一次这个参数全局变量 后续辉修改这个参数的值 我这样写 报错了 请问如何修改呢?