Javascript 从承诺中返回然后()
我得到了如下javascript代码:Javascript 从承诺中返回然后(),javascript,promise,Javascript,Promise,我得到了如下javascript代码: function justTesting() { promise.then(function(output) { return output + 1; }); } var test = justTesting(); 对于var测试,我总是得到一个未定义的值。我认为这是因为承诺尚未解决。有一种方法可以从承诺返回值?要使用承诺,您必须调用创建承诺的函数,或者您必须自己创建一个承诺。你并没有真正描述你真正想要解决的问题,但以下是你自己如何做出
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解析承诺后无法返回值。
这不是真的,请看,这里有一个更准确的答案()请参见//旧答案
最后一节代码