Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js can';t将映射设置为异步_Node.js_Amazon S3_Youtube Api - Fatal编程技术网

Node.js can';t将映射设置为异步

Node.js can';t将映射设置为异步,node.js,amazon-s3,youtube-api,Node.js,Amazon S3,Youtube Api,我正在尝试从s3中读取一个文件,该文件存储了艺术家的名字,并在youtube上获得了前10首歌曲。 我能够获取s3数据,并且能够使用youtube数据api获取数据, 我想将数据存储在我创建的名为singer的对象数组中 console.log("Loading up the best code ever!!!"); var fs = require('fs'); // Load the SDK for JavaScript var AWS = require('aws-sdk'); var

我正在尝试从s3中读取一个文件,该文件存储了艺术家的名字,并在youtube上获得了前10首歌曲。

我能够获取s3数据,并且能够使用youtube数据api获取数据,
我想将数据存储在我创建的名为singer的对象数组中

console.log("Loading up the best code ever!!!");

var fs = require('fs');
// Load the SDK for JavaScript
var AWS = require('aws-sdk');
var jsonfile = require('jsonfile')
var Singer = require('./Singer')
// Set the region 
AWS.config.update({ region: "us-west-1" });
var credentials = new AWS.SharedIniFileCredentials();
AWS.config.credentials = credentials;
// Create S3 service object
s3 = new AWS.S3({ apiVersion: '2006-03-01' });
console.log("after S3");


// Create the parameters for calling createBucket
var bucketParams = {
    Bucket: 'pc-backend-exercises',
    Key: 'toSearch.json',
    ResponseContentType: 'application/json'
};

/// youtube part
var YTAPI = require('node-youtubeapi-simplifier');

var APIKEY = 'kekekek' 

YTAPI.setup(APIKEY);

var singers = [];
var print = function printJson() {

    console.log('entered printJson')
    console.log(singers);
    var results = {}
    for (var i = 0; i < singers.length; i++) {
        results[singers[i].name] = singers[i];

    }
    JSON.stringify(results);
    console.log(results);
}


s3.getObject(bucketParams, function (err, data) {
    // Handle any error and exit
    console.log('download json file from s3');
    if (err) {
        console.log(err, err.stack);
        return err;
    }
    var fileContents = data.Body.toString();
    var json = JSON.parse(fileContents);

    for (var i = 0; i < json.Search.artists.length; i++) {
        var newSinger = new Singer(json.Search.artists[i]);
        singers.push(newSinger);
    }

    search10TopForASinger(print);

});

function search10TopForASinger(print) {
    console.log('entered search10TopForASinger ')
    for (var i = 0; i < singers.length; i++) {
        //Gets only 10 results
        var songsMap = singers[i].songs;
        YTAPI.searchFunctions.simpleSearch(singers[i].name).then(
            function (data) {
                setMap(data,songsMap);
            });
    }
    print();
}

function setMap(data, songs) {
    console.log('entered setMap')
    var size = 10;
    if (data.length < 10) {
        size = data.length;
    }

    for (var i = 0; i < size; i++) {
       songs.set(i, data[i].title);
    }
    console.log(songs);
}

因此,代码正在运行,我确实找到了每个歌手的前10首歌曲,但是当我转到printJson函数时,歌曲映射为空

请记住,同步代码不会等待异步代码解析。它将触发异步函数,然后立即转到下一行。所以在这个函数中:

function search10TopForASinger(print) {
    console.log('entered search10TopForASinger ')
    for (var i = 0; i < singers.length; i++) {
        //Gets only 10 results
        var songsMap = singers[i].songs;
        YTAPI.searchFunctions.simpleSearch(singers[i].name).then(
            function (data) {
                setMap(data,songsMap);
            });
    }
    print();
}
Promise.all
接受一系列承诺,这就是歌手的承诺。map将返回。它将返回一个promise本身,该promise本身只在数组中的每个promise完成后才解析


如果您正在运行Node 8,还可以使用,无需进行太多重构:

async function search10TopForASinger(print) {
    for (var i = 0; i < singers.length; i++) {
        var songsMap = singers[i].songs;
        var data = await YTAPI.searchFunctions.simpleSearch(singers[i].name);
        setMap(data, songsMap);
    }
    print();
}
异步函数search10TopForASinger(打印){
对于(变量i=0;i

这基本上会创建一个
。然后在后台创建一个
链,因此函数的每一部分都将等待
wait
解析后继续。请记住,您必须将
search10TopForASinger
转换为一个异步函数,才能使其正常工作。

我会添加一些控制台日志并检查您的假设。我很好奇当第65行实际被调用时,
signers
I
等于什么,因为根据您的日志判断,
singers[I]
是未定义的。@ZacDelventhal我已经更新了我的代码,地图在那里,但我无法更新它以将其放到outterscope上
function search10TopForASinger(print) {
    Promise.all(singers.map(function(singer) {
        var songsMap = singer.songs;
        return YTAPI
            .searchFunctions
            .simpleSearch(singer.name)
            .then(function(data) {
                setMap(data, songsMap)
            })
    })).then(function(results) {
        print()
    })
}
async function search10TopForASinger(print) {
    for (var i = 0; i < singers.length; i++) {
        var songsMap = singers[i].songs;
        var data = await YTAPI.searchFunctions.simpleSearch(singers[i].name);
        setMap(data, songsMap);
    }
    print();
}