在没有解析或拒绝的情况下构建承诺

时间:2017-05-26 17:28:17

标签: javascript promise

我有一个异步函数sayHello(),它在greeting()函数内部调用:

function greeting() {
    let P = new Promise();
    sayHello().then(function(){
       //manipulate DOM 
       P.resolve();
    }).catch(function(error)){
       //manipulate DOM 
       P.reject();
    });
    return P;
}

我希望greeting()返回一个承诺,这样调用者就会知道sayHello的工作何时完成。但是这段代码似乎并不正确,因为它表示Promise在构造时应该定义resolvereject个函数。我该怎么办 ?

3 个答案:

答案 0 :(得分:3)

只需返回Promise返回的sayHello()

function greeting() {
  return sayHello().then(function(){
    //manipulate DOM 
  }).catch(function(error)){
    //manipulate DOM 
  });
}

then method返回一个承诺。 这是一个简单的fiddle来说明这一点。

答案 1 :(得分:0)

async function greeting() {
  let response
  try {
    response = await sayHello()
  } catch(err) {
    response = err
  }
  return response
}

greeting().then(response => console.log(response))

function greeting2() {
  return new Promise((resolve, reject) => {
    sayHello().then(_ => {
      //manipulate DOM
      resolve()
    }).catch(err => {
      //manipulate DOM 
      reject()
    })
  })
}

greeting2().then(_ => console.log('something'))

答案 2 :(得分:0)

其他答案提供了很好的解决方案,但是您看到错误的实际原因是: Promise应该解析并拒绝构造时定义的函数。是您的特定Promise实现使用。最新版本需要一个"执行者"在调用它时作为第一个参数:

new Promise(/* this is the executor: */ function (resolve, reject) { ... });

您可以在此处查看规范:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

较旧版本的Promise未遵循相同的规范。