为什么从函数返回的promise解析为从.then返回的值

时间:2019-04-08 11:02:35

标签: javascript promise

我创建了一个返回诺言的函数。

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函数中没有返回任何承诺。

我可以解决它。但是为什么会发生。

3 个答案:

答案 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中已解决的承诺被解决,这意味着vthen中的api1等于'A',则then函数将'B'返回到下一个,即then中的then(v => console.log("Api2 call", v));,值v等于'B' 。希望你能理解!