JavaScript Promise包含在功能还是裸露?

时间:2017-02-07 23:28:24

标签: javascript promise es6-promise

如果我正在调用一个承诺函数,我是否需要将其“包装在另一个函数”图层中?

Promise
.resolve()
.then(()=>{ // this part seems excessive
  return new Promise(resolve={
  // my function's guts

我可以直接退回新承诺,例如

Promise
.resolve()
.then(new Promise(resolve={
  // my function's guts

4 个答案:

答案 0 :(得分:1)

你必须将承诺包装在另一个函数中。

但是,你可以缩短它,因为:

() => {
    return new Promise()
}

相同
() => new Promise() 

所以你可以这样做:

Promise
.resolve()
.then(() => new Promise(resolve => {
  // your function's guts

答案 1 :(得分:1)

创建新承诺时无需使用Promise.resolve()

创建promise的常用方法是创建一个返回promise的函数:

function myFunc() {
   return new Promise((resolve, reject) => {
       // your async logic here
   });
}

然后,你这样称呼它:

myFunc().then(result => {
    // code that uses async result here
});

并且,您已将您的承诺创建逻辑放入可重用的功能中。

创建新的承诺而不将其置于包含函数中是可能的(尽管通常不太实际)。例如,您可以这样做:

new Promise((resolve, reject) => {
    // async logic here that eventually calls resolve or reject
}).then(result => {
    // process async result here
}).catch(err => {
    // process error here
});

答案 2 :(得分:1)

  

如果我正在调用一个承诺函数,我是否需要这样做   “将它包装在另一个函数”层中?

是的,否则它会立即执行我建议你在一个命名函数中创建你的promises,它允许你保持你的链整洁可读,代码更可重用。

myTask1()
  .then(myTask2)
  .then(myTask3);

function myTask1() {
  return new Promise((resolve, reject) => {
    console.log("Task 1");
    resolve("Task 1");
  })
}

function myTask2() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("Task 2");
      resolve("Task 2");
    }, 1000)

  })
}

function myTask3() {
  return new Promise((resolve, reject) => {
    console.log("Task 3");
    resolve("Task 3");
  })
}

  

我可以直接退回新承诺吗,例如.... .then(new Promise(resolve={

没有与实例化这样的承诺有一个关键的区别。当你在一个函数中包装promise时,它会在前一个promise完成之前被评估,而如果你将它实例化为inline,那么它会立即被评估,这可能会导致意外的结果:

new Promise((resolve, reject) => {
    resolve()
  })
  .then(new Promise((resolve, reject) => {
    console.log("Task 1");
  }))
  .then(new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("Task 2");
      resolve("Task 2");
    }, 1000);
  }))
  .then(new Promise((resolve, reject) => {
    console.log("Task 3");
    resolve("Task 3");
  }))

为了完成上述工作,您可以更改它,以便闭包返回一个promise,但它看起来很混乱:

new Promise((resolve, reject) => {
    resolve()
  })
  .then(() => {
    return new Promise((resolve, reject) => {
      console.log("Task 1");
      resolve("Task 1");
    })
  })
  .then(() => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log("Task 2");
        resolve("Task 2");
      }, 1000);
    });

  })
  .then(() => {
    return new Promise((resolve, reject) => {
      console.log("Task 3");
      resolve("Task 3");
    });
  })

答案 3 :(得分:0)

then的处理程序只能返回一个值。

Promise.resolve('value').then(() => 'otherValue');