Javascript 从承诺中返回然后()

Javascript 从承诺中返回然后(),javascript,promise,Javascript,Promise,我得到了如下javascript代码: function justTesting() { promise.then(function(output) { return output + 1; }); } var test = justTesting(); 对于var测试,我总是得到一个未定义的值。我认为这是因为承诺尚未解决。有一种方法可以从承诺返回值?要使用承诺,您必须调用创建承诺的函数,或者您必须自己创建一个承诺。你并没有真正描述你真正想要解决的问题,但以下是你自己如何做出

我得到了如下javascript代码:

function justTesting() {
  promise.then(function(output) {
    return output + 1;
  });
}

var test = justTesting();

对于var测试,我总是得到一个未定义的值。我认为这是因为承诺尚未解决。有一种方法可以从承诺返回值?

要使用承诺,您必须调用创建承诺的函数,或者您必须自己创建一个承诺。你并没有真正描述你真正想要解决的问题,但以下是你自己如何做出承诺:

功能测试(输入){
返回新承诺(功能(解决、拒绝){
//这里有一些异步操作
setTimeout(函数(){
//用一些价值来解决承诺
解析(输入+10);
}, 500);
});
}
测试(29)。然后(功能(val){
//您可以从此处的承诺中获取价值
对数(val);
});
//在代码段中显示输出
函数日志(x){
文件。编写(x);

}
当您从
then()
回调返回某些内容时,这有点神奇。如果返回一个值,将使用该值调用下一个
then()
。但是,如果您返回一些promise,例如,下一个
then()
将等待它,并且只有在该promise解决(成功/失败)时才会调用它


来源:

我在这里所做的是从justTesting函数返回了一个承诺。然后,您可以在解析函数时获得结果

// new answer

function justTesting() {
  return new Promise((resolve, reject) => {
    if (true) {
      return resolve("testing");
    } else {
      return reject("promise failed");
   }
 });
}

justTesting()
  .then(res => {
     let test = res;
     // do something with the output :)
  })
  .catch(err => {
    console.log(err);
  });
希望这有帮助

// old answer

function justTesting() {
  return promise.then(function(output) {
    return output + 1;
  });
}

justTesting().then((res) => {
     var test = res;
    // do something with the output :)
    }
我更喜欢使用“wait”命令和异步函数来消除承诺的混乱

在本例中,我将首先编写一个异步函数, 将使用此函数代替在该问题的“promise.then”部分下调用的匿名函数:

async function SubFunction(output){

   // Call to database , returns a promise, like an Ajax call etc :

   const response = await axios.get( GetApiHost() + '/api/some_endpoint')

   // Return :
   return response;

}
然后我从主函数调用这个函数:

async function justTesting() {
   const lv_result = await SubFunction(output);

   return lv_result + 1;
}

注意,我在这里将主函数和子函数都返回给异步函数。

承诺不“返回”值,它们将值传递给回调函数(由.then()提供)

它可能试图说你应该做
resolve(someObject)在promise实现中


然后在
然后
代码中,您可以引用
某个对象
来执行您想要的操作。

解析承诺后,您不能返回值。在解决承诺时调用另一个函数:

function justTesting() {
    promise.then(function(output) {
        // instead of return call another function
        afterResolve(output + 1);
    });
}

function afterResolve(result) {
    // do something with result
}

var test = justTesting();

您需要使用数组或对象之类的引用数据类型

function foo(u,n){
  let result = [];
  const userBrands = new Promise((res, rej)=> {
                        res(['brand 1', 'brand 3']);
                      })
  
  userBrands.then((ub)=>{
    return new Promise((res, rej) =>{
      res([...ub, 'brand 4', 'brand 5']);
    })
  }).then(response => {
    return result.push(...response);
  });
  return result;
};
foo();

then()
调用的返回值也是一个承诺,它封装了返回的值。test是未定义的,因为justTesting在示例中不返回任何内容(您没有返回)。添加一个返回,测试将被定义为承诺。感谢您的反馈。重点是将输出+1分配给测试。变量
promise
。您不会在任何地方显示它的定义,也不会从
justTesting()
函数返回任何内容。如果你想得到更好的帮助,你需要描述你试图解决的问题,而不是仅仅向我们展示那些太“离谱”以至于不能说明你真正想做什么的代码。解释你试图解决的问题。讽刺的是,每一个答案都告诉我们如何返回另一个呼叫承诺。如果在“//对输出做些什么”中,我放了一个返回语句,会发生什么?例如:我将在父函数中使用“JustTesting().then…”。我能否在“then”部分中返回一个值?如果您想从//返回一个值,则必须在justTesing()之前添加一个返回值。例如,“return justTesting().then((res)=>{return res;});好吧,这就是我所期望的,我只是想确定:)谢谢!让我感到不舒服的是双
return
,即
justTesting
表示
return.then=>return
。我知道这是有效的,因为我已经实现了这个(bcs linting强迫我远离
新承诺
),但你能解释一下如何理解/思考返回/返回对吗?@RonRoyston-首先,你传递给
的函数。然后()
是一个独立于包含函数的函数,因此在调用它时,它有自己的返回值。其次,来自
.then()的返回值成为承诺的解析值。因此,
.then(val=>{return 2*val;})
正在将解析值从
val
更改为
2*val
。很好地解释了mate。谢谢。似乎正是因为这个原因,我可以使用promise链在相关中同步迭代带有Ajax请求的数组,但是promise.如何捕获每个解析的promise的返回值?对…使用Wait Make它更干净,也解决了issueperfect问题,但是如果服务失败怎么办?它会返回正确的承诺吗?Hi@minigeek,您应该在它的TRY-CATCH块之间放置wait命令,如下所示:TRY{const lv_result=wait SubFunction(output);}CATCH(error){console.log(“错误读取图像”,error)}它尝试了这个方法,但没有成功,所以我最终返回了承诺本身lol
解析承诺后无法返回值。
这不是真的,请看,这里有一个更准确的答案()请参见
//旧答案
最后一节代码