我创建了一个返回诺言的函数。
function fetch1 () {
return new Promise((res, rej) => {
res("A");
});
}
我在函数api1中调用此函数,并返回从fetch1返回的promise。
function api1 () {
return fetch1().then(v =>{
console.log("Api1", v);
return "B"
);
}
如您所见,我正在返回从fetch1返回的相同值。我没有创建任何新的Promise。但是当我称呼它时,我得到以下输出。
api1().then(v => console.log("Api2 call", v));
Api1 A
Api2 call B
我的预期输出应该是
Api1 A
Api2 call A
您可以从此link中看到。然后,那个承诺就被束缚了。从先返回的承诺然后在下一个解决。但是从那时起,我在api1函数中没有返回任何承诺。
我可以解决它。但是为什么会发生。
答案 0 :(得分:3)
当您返回Promise时,实际上并没有返回Promise内 的内容,而是Promise本身。当你说
public Response generate(List<Object> objects){
if(objects instanceof List<ClassA>){
/*List<ClassA> classA =(List<ClassA>) (Object) objects;
System.out.println(classA.lastIndexOf(classA));
System.out.println("after downcasting");
*/
/*List<ClassA> customer = (List<ClassA>) objects.stream()
.filter(ClassA.class::isInstance)
.map(ClassA.class::cast)
.collect(Collectors.toList());*/
List<ClassA> classA=(List<ClassA>)(Object)objects;
addDataToExcel(classA);
}
else if(objects instanceof ClassB){
ClassB classb=(ClassB) objects;
}
else if(objects instanceof ClassC){
ClassC classc=(ClassC) objects;
}
return response;
}
您是说“ function api1 () {
return fetch1().then(v =>{
console.log("Api1", v);
return "B"
);
}
是前一个Promise的结果,然后返回包含console.log
的 new 许诺。
所以当你打电话
B
原始Promise(包含“ A”)已被消耗,新的Promise包含您先前返回的字符串“ B”。
要获得所需的输出,请像这样重写第二部分:
api1().then(v => console.log("Api2 call", v));
答案 1 :(得分:0)
如您所见,我将返回从fetch1返回的相同值
实际上并非如此,您是在then
之后打电话给fetch1
。确实有所作为。
使用同步,非承诺代码几乎是相同的。如果返回方法:
return sum(3,7).multiply(2);
您不只是返回sum(3,7)
,因为在此之后您将调用multiply(2)
。由于进行了multiply
调用,该操作将返回数字20。
带有承诺的内容几乎相同,例如:
const myResultPromise = return sumPromise(3,7).then(sumValue => {
return multiplyPromise(2);
})
在这里,myResultPromise
的承诺为20,因为then
将新的Promise附加到原始的sumPromise
。
答案 2 :(得分:0)
function fetch1 () {
return new Promise((res, rej) => {
res("A");
});
}
function api1 () {
return fetch1().then(v =>{
console.log("Api1", v);
return "B"
});
}
api1().then(v => console.log("Api2 call", v));
调用api1().then(v => console.log("Api2 call", v));
时,api1()
将等待fetch1中已解决的承诺被解决,这意味着v
中then
中的api1
等于'A',则then
函数将'B'返回到下一个,即then
中的then(v => console.log("Api2 call", v));
,值v
等于'B' 。希望你能理解!