为什么承诺解决未定义?

时间:2017-07-13 23:43:17

标签: promise

var firstPromise = new Promise((resolve, reject) => {
  resolve('first promise');
});

firstPromise.then(() => {
  return new Promise((resolve, reject) => {
    resolve('second promise');
  }).then((result) => {
    console.log('hello');
  });
}).then((result) => {
  console.log(result);
});

控制台日志输出

'hello'
undefined

我知道这不是编写此承诺链的最佳方式,但我想知道为什么最后.then执行。我没有用console.log('hello')返回任何内容,所以第二个承诺的关闭不会解决吗?

3 个答案:

答案 0 :(得分:5)

因为您已将多个承诺链接在一起,并且您的.then()处理程序之一没有返回任何内容。

这部分:

.then((result) => {
  console.log('hello');
  // since there is no return value here, the promise chain's resolved
  // value becomes undefined

值     });

返回与return undefined基本相同的任何内容,因此链的解析值变为undefined

您可以将其更改为此值以保留已解析的值:

.then((result) => {
  console.log('hello');
  return result;         // preserve resolved value of the promise chain
});

请记住,每个.then()处理程序的返回值将成为未来链的已解析值。没有返回值会使解析后的值为undefined

答案 1 :(得分:0)

你的最后一个.then正在接收你的嵌套Promise中创建的结果,并且,因为你没有返回任何东西(即你只是在做console.log('hello')),所以结果是未定义的。如果您实际返回了某些内容,则可以看到此行为:

routes.MapRoute(
    name: "Partner",
    url: "Partner/{id}",
    defaults: { controller = "Home", action = "Partner" }
);

这会输出:

    var firstPromise = new Promise((resolve, reject) => {
      resolve("first promise");
    });

    firstPromise
      .then(() => {
        return new Promise((resolve, reject) => {
          resolve("second promise");
        }).then(result => {
          console.log("hello");
          return "something";
        });
      })
      .then(result => {
        console.log(result);
      });
  }   

答案 2 :(得分:0)

您可以在答应解决后呼叫任意数量的then。 您的情况: // 1 已解决的承诺已分配给 // 2 结果 // 4 没有退货可以使用。因此,结果是不确定的。

var firstPromise = new Promise((resolve, reject) => {
    resolve('first promise');
});

firstPromise.then(() => {
    return new Promise((resolve, reject) => {
        resolve('second promise');//1
    }).then((result) => {
        console.log(result);//2
        console.log('hello');//3
    });
}).then((result) => {
    console.log(result);//4
}).then((result) => {
    console.log(result);
}).then((result) => {
    console.log(result);
}).then((result) => {
    console.log(result);
})

如果您在 // 3 结果被确认后返回了某物。

var firstPromise = new Promise((resolve, reject) => {
    resolve('first promise');
});

firstPromise.then(() => {
    return new Promise((resolve, reject) => {
        resolve('second promise');//1
    }).then((result) => {
        console.log(result);//2
        console.log('hello');//3
        return("test")
    });
}).then((result) => {
    console.log(result);//4
}).then((result) => {
    console.log(result);
}).then((result) => {
    console.log(result);
}).then((result) => {
    console.log(result);
})