Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 处理完数组中的所有项后调用done()_Javascript_Foreach_Promise_Settimeout - Fatal编程技术网

Javascript 处理完数组中的所有项后调用done()

Javascript 处理完数组中的所有项后调用done(),javascript,foreach,promise,settimeout,Javascript,Foreach,Promise,Settimeout,例如: 此代码返回: a b done 2 4 如何更改代码,使其仅在处理完数组中的所有项后才调用done()? i、 e: 使用Promises. 将每个流程包装在一个承诺中,该承诺在流程完成时得到解决。 然后将所有承诺包装在一个Promise.all中,这将创建一个新的Promise,一旦所有包装好的承诺都得到解决,该承诺就会得到解决。 然后调用done函数 var processes = [1,'a',2,'b'].map(function(item){ if (typeof ite

例如:

此代码返回:

a
b
done
2
4
如何更改代码,使其仅在处理完数组中的所有项后才调用done()? i、 e:


使用
Promise
s.
将每个流程包装在一个
承诺中,该承诺在流程完成时得到解决。
然后将所有承诺包装在一个
Promise.all
中,这将创建一个新的
Promise
,一旦所有包装好的承诺都得到解决,该承诺就会得到解决。
然后调用
done
函数

var processes = [1,'a',2,'b'].map(function(item){
  if (typeof item === 'number') {
    return new Promise(function(resolve) {
      setTimeout(function(){
        console.log(item * 2);
        resolve();
      },1000);
    });
  } else if (typeof item === 'string') {
    console.log(item);
    return Promise.resolve(); // A Promise that resolves immediately
  }
});
Promise.all(processes).then(done);

使用
承诺
s.
将每个流程包装在一个
承诺中,该承诺在流程完成时得到解决。
然后将所有承诺包装在一个
Promise.all
中,这将创建一个新的
Promise
,一旦所有包装好的承诺都得到解决,该承诺就会得到解决。
然后调用
done
函数

var processes = [1,'a',2,'b'].map(function(item){
  if (typeof item === 'number') {
    return new Promise(function(resolve) {
      setTimeout(function(){
        console.log(item * 2);
        resolve();
      },1000);
    });
  } else if (typeof item === 'string') {
    console.log(item);
    return Promise.resolve(); // A Promise that resolves immediately
  }
});
Promise.all(processes).then(done);

为什么要使用setTimeout?这很重要,还是你只需要数组中的字符串和数字?@MichałDąbrowski实际上我只是用setTimeout来模拟这个问题。实际上,我正在寻找一种方法来避免另一个fabricjs函数出现这个问题:object.clone(function(clone){…})为什么使用setTimeout?这很重要,还是你只需要数组中的字符串和数字?@MichałDąbrowski实际上我只是用setTimeout来模拟这个问题。实际上,我正在寻找另一个fabricjs函数来避免这个问题:object.clone(function(clone){…})
var processes = [1,'a',2,'b'].map(function(item){
  if (typeof item === 'number') {
    return new Promise(function(resolve) {
      setTimeout(function(){
        console.log(item * 2);
        resolve();
      },1000);
    });
  } else if (typeof item === 'string') {
    console.log(item);
    return Promise.resolve(); // A Promise that resolves immediately
  }
});
Promise.all(processes).then(done);