当前位置: 首页 > 知识库问答 >
问题:

试图定义一个promise。全部

荆弘伟
2023-03-14

我试图通过在本书的练习中创建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);
    }
  });

共有1个答案

汪才英
2023-03-14

正如@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 是单线程工作,但是浏览器是多线程的。为了更好的完成我们

  • 我想在调用这个函数的时候 初始化一次这个参数全局变量 后续辉修改这个参数的值 我这样写 报错了 请问如何修改呢?