JavaScript Promise 封装在函数中还是裸露的?

标签 javascript promise es6-promise

如果我调用一个 Promise 函数,我是否需要执行“将其包装在另一个函数中”层?

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

我可以直接返回新的 Promise,例如

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

最佳答案

If I'm calling a function that is a promise, do I need to do this "wrap it in another function" layer?

是的,否则它将立即执行,我建议您在命名函数中创建您的 promise ,这样您就可以保持链整洁和可读,并且代码更可重用。

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");
  })
}

Can I return the new promise directly, like.... .then(new Promise(resolve={?

不,像这样实例化 promise 有一个关键的区别。当您将 Promise 包装在函数中时,直到前一个 Promise 完成后才会对其进行求值,而如果您内联实例化它,则会立即对其进行求值,这可能会导致意外结果:

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");
    });
  })

关于JavaScript Promise 封装在函数中还是裸露的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42101937/

相关文章:

Javascript日期到UTC时间戳

javascript - 什么是显式 promise 构造反模式,我该如何避免它?

javascript - 这是 chrome 中关于图像加载的错误吗?

javascript - 在异步生成器 JS 中处理同步流

javascript - 使用 Promises 进行 Mongoose 错误处理

javascript - Node.js 等待异步函数完成,然后继续执行其余代码

javascript - 如何在 Chartist.js 中使用负数

javascript - <a href 中的 onClick 导致 Uncaught ReferenceError : $ is not defined?

javascript( promise )拼图

javascript - 如何将 "await"用于生成器函数是 ES6?