Обещание с Javascript - PullRequest
       6

Обещание с Javascript

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

Я изо всех сил пытаюсь понять Обещание, но это действительно трудно для меня. это сводит меня с ума, я был бы признателен за вашу помощь.

это код, и я хочу "console.log (data)" после того, как функция Recom будет завершена но результат не определен. Что я должен делать? большое спасибо

Это app.js

var _promise = function () {
    return new Promise((resolve,reject) => {
        var data = getJS.Recommend(req.query.User_id)
        resolve(data)
    }).then(function(data) {
        console.log(data)
    })

    _promise();
}})

это RecomPost.js

exports.Recommend =(myId)=>{
    var posts=[]
    User.find({
        User_id : myId
    }).then((result)=>{
        return User.find()
            .select('User_id')
            .where('age').equals(result[0].age)
    }).then((User_id)=>{
        return Promise.all(User_id.map((user,idx,arr)=>{
            return Count.find()
                .select('board_id')
                .where('User_id').equals(user.User_id)
        }))
    }).then((Users_id)=>{
        Users_id.forEach(items=>{
            items.forEach(post=>{
                posts.push(post.board_id)
            })
        })
    }).then(()=>{
        return getMax(posts);
    })
}

ср. В RecomPost.js посты работают синхронно

// -------- Я решил эту проблему! как говорили некоторые парни, функция Recommended должна возвращать Promise. Так что я отредактировал, тогда это сработало! это отредактированный код. спасибо, что помогли мне:)

Это app.js

var _promise = function () {
        return new Promise((resolve, reject) => {
            getJS.Recommend(req.query.User_id).then((data) => {
                resolve(data);
            })
        })
    }
    _promise().then((data) => { console.log(data) });

это RecomPost.js

exports.Recommend =(myId)=>{
    return new Promise((resolve,reject)=>{
        var posts=[]
        User.find({
            User_id : myId
        }).then((result)=>{
            return User.find()
                .select('User_id')
                .where('age').equals(result[0].age)
        }).then((User_id)=>{
            return Promise.all(User_id.map((user,idx,arr)=>{
                return Count.find()
                    .select('board_id')
                    .where('User_id').equals(user.User_id)
            }))
        }).then((Users_id)=>{
            Users_id.forEach(items=>{
                items.forEach(post=>{
                    posts.push(post.board_id)
                })
            })
        }).then(()=>{
            resolve (getMax(posts));
        })
    })
}

Ответы [ 4 ]

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

ES5:

var _promise = function () {
    return new Promise((resolve, reject) => {
        getJS.Recommend(req.query.User_id).then((data) => {
            resolve(data);
        })
    })
}

_promise().then((data) => { console.log(data) });

ES6:

var _promise = async () => {
    return await getJS.Recommend(req.query.User_id);
}

_promise().then((data) => { console.log(data) });
0 голосов
/ 06 сентября 2018

При вызове resolve функция означает, что функция завершена и возвращается к вызывающей стороне.
объект данных в then не существует

Метод Promise.resolve (значение) возвращает объект Promise, который разрешается с заданным значением. Если значение является обещанием, это обещание возвращается; если значение является доступным (то есть имеет метод then), возвращенное обещание «последует» за этим, приняв его возможное состояние; в противном случае возвращенное обещание будет выполнено с значение.

ES5:

var _promise = function (req) {
    return new Promise((resolve,reject) => {
        getJS.Recommend(req.query.User_id).then((data)=>{
            console.log(data)
            resolve(data)
        },(err)=>{
            console.log(err)
            reject(err);
        })
    })
}
_promise(req);

ES6

async function _promise(req) {
   return await getJS.Recommend(req.query.User_id)
}

Для редактирования (весь код):

В этом случае функция Recommend возвращает обещание, вам не нужна функция _promise, которая оборачивает его другой.

и вы называете это прямым

getJS.Recommend(req.query.User_id).then(
 (data) => { 
  console.log(data) 
});
0 голосов
/ 06 сентября 2018

Для вас может быть понятнее, если async/await делает асинхронный код похожим на синхронный:

async function main() {
  var data = await getJS.Recommend(req.query.User_id); // waits till its done before going to the next line
  console.log(data);
}

// unimportant specific implementation details for live example:

const getJS = {
  Recommend(id) {
    data = "some data for user ";
    return new Promise((res) => setTimeout(() => res(data + id), 1000));
  }
}

const req = {
  query: {
    User_id: 5
  }
}

main();
0 голосов
/ 06 сентября 2018

Обещания означает, что он всегда будет возвращать что-либо, либо ошибку, либо успех.

если вы решите что-то, оно вернется оттуда. так что твоя часть потом не выполнится.

, поэтому, если вы используете функцию разрешения и отклонения параметров, используйте метод .catch.

return new Promise((resolve,reject) => {
    var data = getJS.Recommend(req.query.User_id)
    resolve(data)
}) .catch(function (ex) { // in case of error
    console.log(ex);
})
...