从异步函数返回值

时间:2016-08-14 18:19:07

标签: javascript node.js

我是JS和Node的新手。我的困惑是如何将值从异步任务推送到数组,然后在完成所有操作后打印数组。

我的代码是:

function movieNames(dirname) {
    return new Promise(function (resolve, reject) {
        dir.files(dirname, function (err, files) {
            if (err) {
                reject(err)
            } else {
                resolve(files)
            }
        })
    })
}


function movieMetadata(path) {
    return new Promise(function (resolve, reject) {
        probe(path, function (err, probeData) {
            if (err) {
                reject(err)
            } else {
                resolve(probeData)
            }
        })
    })
}

var movies = []
movieNames('D:/Media').then(function (moviepaths) {
    moviepaths.forEach(function (moviepath) {
        movieMetadata(moviepath).then(function (movie) {
         //console.log(movie)
        movies.push(movie)
    }, function (error) {
        console.log(error)
    })
    })
}, function (error) {
    console.log(error)
}).then(function () {
    console.log(movies)
})

当我运行此代码时,它只打印空数组'[]'。

我还运行以下代码:

var i=0;
movieNames('D:/Media').then(function (moviepaths) {
    moviepaths.forEach(function (moviepath) {
        movieMetadata(moviepath).then(function (movie) {
         //console.log(movie)
        movies.push(movie)
        console.log(i++)
        // movies = movie
    }, function (error) {
        console.log(error)
    })
    })
}, function (error) {
    console.log(error)
}).then(function () {
    console.log(movies)
})

输出为:node movieNames.js [] 0 1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 17 18

我无法理解为什么console.log(电影)在console.log(i ++)之前被执行。如果我只是修复此问题,我相信代码应运行正常。

1 个答案:

答案 0 :(得分:-1)

试试这个例子:http://jsbin.com/hipisogilu/edit?js,console 你需要嵌套你的promises链,因为它是异步的