Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 在没有冲突解决者或拒绝的情况下构建承诺_Javascript_Promise - Fatal编程技术网

Javascript 在没有冲突解决者或拒绝的情况下构建承诺

Javascript 在没有冲突解决者或拒绝的情况下构建承诺,javascript,promise,Javascript,Promise,我有一个异步函数sayHello(),在greeting()函数中调用: function greeting() { let P = new Promise(); sayHello().then(function(){ //manipulate DOM P.resolve(); }).catch(function(error)){ //manipulate DOM P.reject(); });

我有一个异步函数
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在构造时应该定义
resolve
reject
函数。我该怎么办

只需返回由
sayHello()
返回的
Promise

回报是一种承诺。
这里有一个简单的例子说明这一点。

只需返回
sayHello()返回的
Promise

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'))
回报是一种承诺。
这里有一个简单的例子来说明这一点。

其他答案提供了很好的解决方案,但您看到错误的实际原因是:Promise在构造时应该定义resolve和reject函数。是您正在使用的特定
承诺
实现。最新版本要求调用“executor”函数时将其作为第一个参数:

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'))
new Promise(/* this is the executor: */ function (resolve, reject) { ... });
您可以在此处看到规范:


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

其他答案提供了很好的解决方案,但您看到错误的实际原因是:Promise在构造时应该定义了resolve和reject函数。是您正在使用的特定
承诺
实现。最新版本要求调用“executor”函数时将其作为第一个参数:

new Promise(/* this is the executor: */ function (resolve, reject) { ... });
您可以在此处看到规范:


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

不要这样做。相反,直接返回您的承诺链。如果你已经有承诺,你永远不需要
new Promise()
。我不想在问候语的调用者中操纵DOM,我想在问候语中这样做。这不会改变任何事情。你仍然可以返回承诺链。你可以发布代码吗?@ArianHosseinzadeh你是什么意思<代码>返回sayHello()
.then()
是否链接到
问候语()
调用,该调用需要一个值?不要这样做。相反,直接返回您的承诺链。如果你已经有承诺,你永远不需要
new Promise()
。我不想在问候语的调用者中操纵DOM,我想在问候语中这样做。这不会改变任何事情。你仍然可以返回承诺链。你可以发布代码吗?@ArianHosseinzadeh你是什么意思<代码>返回sayHello()。是
.then()
链接到
greeting()
调用期望值吗?
greeting
输出一个承诺(结果,
greeting
的调用方可以使用它并调用
然后
)。那么,
那么
总是要回报承诺吗?即使我们没有
返回
其中的任何内容?@ArianHosseinzadeh是的,
。然后()
返回一个新的
承诺
对象,这也很重要,可以解释,如果您有一个
.catch()
处理程序,它不会重新抛出或返回被拒绝的承诺,那么返回的承诺将切换到已解析的状态(就像try/catch中的catch块阻止异常向上传播一样。因此,您所显示的内容永远不会告诉打招呼的人
sayHello()
失败。
greeting
输出一个承诺(结果是,
打招呼的人可以使用它并调用
然后
)所以,
然后
总是返回一个承诺吗?即使我们没有
返回
其中的任何东西?@ArianHosseinzadeh是的,
。然后()
返回一个新的
承诺
目标也很重要,可以解释如果你有一个
.catch()
处理程序,该处理程序不会重新抛出或返回被拒绝的承诺,即返回的承诺将切换到已解决状态(就像try/catch中的catch块阻止异常向上传播一样。因此,您显示的内容永远不会告诉打招呼的调用方
sayHello()
失败。