Что означает then (), возвращенный внутри рекурсивного обещания - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть следующий код:

function someAsyncOperation(){
    const myArray = [1,2,3,4,5];
    return Promise.resolve(myArray);
    // return Promise.reject("Reject from someAsyncOperation");
}

const random = () => {
    return Math.floor(Math.random() * 10) + 1;
}

const myFunction = (item) => {
    return someAsyncOperation() // this function returns an array
    .then((array) => {
        if(!array.includes(item)){
            console.log(`The element ${item} has NOT been found inside the array`);
            return myFunction(random()).then((r) => console.log(`Hello World ${r}`));
        }
        else{
            console.log(`The element ${item} has been found inside the array`);
            return item;
        }
    });
}

myFunction(random()).then(res => {
    // success
    console.log("Success", res);
}).catch(err => {
    // handle error here which could be either your custom error
    // or an error from someAsyncOperation()
    console.log("Error", err);
});

А вот несколько примеров его результата:

1-й пример ответа

The element 10 has NOT been found inside the array
The element 8 has NOT been found inside the array
The element 7 has NOT been found inside the array
The element 5 has been found inside the array
Hello World 5
Hello World undefined
Hello World undefined
Success undefined

2-й пример ответа

The element 9 has NOT been found inside the array
Nuevo elemento random generado 10
The element 10 has NOT been found inside the array
Nuevo elemento random generado 3
The element 3 has been found inside the array
Hello World 3
Hello World undefined
Success undefined

3-й пример ответа

The element 5 has been found inside the array
Success 5

Итак, мой вопрос:

Почему иногда выводит Hello World undefined и Success undefined? Я имею в виду точно: что делает это then в return myFunction(random()).then((r) => console.log(Hello World ${r})); ???


EDIT:

Точно, я ожидаю, что в return r ( ответ JaromandaX ниже ) не только найденный результат , но и история не находит результатов в порядке их появления. Вот пример того, что мне нужно:

The element 10 has NOT been found inside the array
The element 8 has NOT been found inside the array
The element 7 has NOT been found inside the array
The element 5 has been found inside the array
Hello World 10
Hello World 8
Hello World 7
Success 5

1 Ответ

0 голосов
/ 12 сентября 2018

Код

return myFunction(random()).then((r) => console.log(`Hello World ${r}`))

вернет обещание, которое разрешается до значения, возвращенного в последнем .then (т. Е. У вас есть цепочка обещаний, а разрешенное значение является результатом цепочки)

В этом случае это значение равно undefined, так как то, что console.log возвращает

, вы, вероятно, хотите вернуть значение, поэтому

return myFunction(random()).then((r) => (console.log(`Hello World ${r}`), r)) 

или

return myFunction(random()).then((r) => {
    console.log(`Hello World ${r}`); 
    return r;
})

Поместив это в ваш код, мы получим

function someAsyncOperation(){
    const myArray = [1,2,3,4,5];
    return Promise.resolve(myArray);
    // return Promise.reject("Reject from someAsyncOperation");
}

const random = () => {
    return Math.floor(Math.random() * 10) + 1;
}

const myFunction = (item) => {
    return someAsyncOperation() // this function returns an array
    .then((array) => {
        if(!array.includes(item)){
            console.log(`The element ${item} has NOT been found inside the array`);
            return myFunction(random()).then((r) => {
                console.log(`Hello World ${r}`);
                return r;
            });
        }
        else{
            console.log(`The element ${item} has been found inside the array`);
            return item;
        }
    });
}

myFunction(random()).then(res => {
    // success
    console.log("Success", res);
}).catch(err => {
    // handle error here which could be either your custom error
    // or an error from someAsyncOperation()
    console.log("Error", err);
});
...