我有一个像这样的javascript代码:
objdump -d a.out --start-address=0x400630 and --stop-address=0x400679 | cut -b 14-30
对于var测试,我总是有一个未定义的值。我认为这是因为承诺没有解决喷射......有一种方法可以从承诺中返回一个值吗?
答案 0 :(得分:97)
当您从then()
回调中返回某些内容时,它有点神奇。如果返回值,则使用该值调用下一个then()
。但是,如果你返回类似promise的东西,那么下一个then()
会等待它,并且只有在该承诺结算(成功/失败)时才被调用。
答案 1 :(得分:44)
要使用承诺,您必须调用创建承诺的函数,或者您必须自己创建承诺。你没有真正描述你真正试图解决的问题,但是你自己就是如何创建一个承诺:
function justTesting(input) {
return new Promise(function(resolve, reject) {
// some async operation here
setTimeout(function() {
// resolve the promise with some value
resolve(input + 10);
}, 500);
});
}
justTesting(29).then(function(val) {
// you access the value from the promise here
log(val);
});
// display output in snippet
function log(x) {
document.write(x);
}
或者,如果您已经有一个返回promise的函数,您可以使用该函数并返回其承诺:
// function that returns a promise
function delay(t) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve();
}, t);
});
}
function justTesting(input) {
return delay(100).then(function() {
return input + 10;
});
}
justTesting(29).then(function(val) {
// you access the value from the promise here
log(val);
});
// display output in snippet
function log(x) {
document.write(x);
}
答案 2 :(得分:8)
我在这里做的是我从justTesting函数返回了一个promise。然后,您可以在解析函数时获得结果。
// 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 :)
}
答案 3 :(得分:7)
我更喜欢使用“ await”命令和异步功能来摆脱承诺的混乱,
在这种情况下,我将首先编写一个异步函数, 将使用它代替该问题的“ 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;
}
请注意,我在这里将主函数和子函数都返回给异步函数。
答案 4 :(得分:1)
Promises
不会“返回”值,它们会将它们传递给回调(您随.then()提供)。
可能是想说您应该在promise实现中执行resolve(someObject);
。
然后在您的then
代码中,您可以引用someObject
做您想做的事情。
答案 5 :(得分:0)
对我来说,回调在这种情况下有效。我遇到了同样的问题,所有先前的答案都对我不起作用(我真的不知道为什么)。因此,应该起作用的代码示例:
function justTesting(callback) {
promise.then(function(output) {
return output + 1;
});
}
then call it:
justTesting(function (yourOutput) {
// here you can use your outpur from justTesting func
var test = yourOutput;
})
答案 6 :(得分:0)
返回承诺而不是返回输出;
function justTesting() {
return promise.then(function(output) {
// It ??? will not work
return output + 1;
});
}
并获得输出
var test;
justTesting().then(function(output) {
test = output + 1;
})
答案 7 :(得分:0)
您不能在兑现承诺后返回价值。解决诺言后,请调用另一个函数:
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();
答案 8 :(得分:0)
您需要使用引用数据类型,如数组或对象。
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();
答案 9 :(得分:0)
就这样做:
async function justTesting() {
const output = await promise;
return (output + 1)
}
var test = justTesting();