Javascript 将变量输出到控制台后,将返回函数中的值

Javascript 将变量输出到控制台后,将返回函数中的值,javascript,Javascript,在循环中,我调用函数并将标识符传递给它,然后函数应将空缺返回给我 const Profile = require('upwork-api/lib/routers/jobs/profile.js').Profile; ... let jobsDetails = []; for (let valueKeys of Object.values(arrayOfJobs)) { getJobDitalis(api, valueKeys, (error, data) => {

在循环中,我调用函数并将标识符传递给它,然后函数应将空缺返回给我

const Profile = require('upwork-api/lib/routers/jobs/profile.js').Profile;
...
let jobsDetails = [];
for (let valueKeys of Object.values(arrayOfJobs)) {
    getJobDitalis(api, valueKeys, (error, data) => {
        console.log(data.profile)
        jobsDetails.push(`${data.profile}`);
    });
    console.log(jobsDetails)
}
...
function getJobDitalis(api, key, callback) {
    const profile = new Profile(api);
    profile.getSpecific(key, (error, data) => {
        callback(error, data);
    });
}
但由于某些原因,首先控制台中显示一个空对象,然后仅显示有关空缺的信息。也就是说,首先触发
console.log(jobsDetails)
,然后只触发
console.log(data.profile)

为什么会这样?我的错误是什么?

流程(让我们假设对
循环进行一次
迭代):

但是,
profile.getSpecific
不一定要等待
func
完成


由于第一次打印是从
func
的调用堆栈执行的,因此不一定会在第二次打印之前执行。

使用async Wait,您可以使异步任务同步

我不知道你的代码结构,但我试图从给定的数据中找出一个解决方案

function getJobDitalis(api, key, callback) {
    const profile = new Profile(api);
    profile.getSpecific(key, (error, data) => {
        callback(error, data);
    });
}
...
(async ()=> {
let jobDetails = [];
for (let valueKeys of Object.values(arrayOfJobs)) {
const profile = await new Promise(resolve=>{
    getJobDitalis(api, valueKeys, (error, data) => {
        console.log(data.profile)
        resolve(data.profile);
    });
  })
 jobDetails.push(profile)
}
 console.log(jobDetails); 
 //do your task with jobDetails
})()

我创建了异步函数。

getJobDetalis是异步函数,所以console.log(data.profile)将在异步请求完成后运行,而console.log(jobsDetails)将运行immediately@Arshpreet我该怎么解决我的问题?看起来这是个问题callback@MegaRoks你的要求是什么?你想让getJobDitalis同步吗?@Arshpreet Wadehra我想
console.log(jobsDetails)
有作业详细信息,而不是空对象。如何让getJobDitalis函数同步?@MegaRoks:它可能返回一个
承诺,你需要解决这个问题。
getJobDetalis(api, key, callback)
    profile.getSpecific(key, func)
        func(error, data)
            callback(error, data)
                console.log(data.profile)
console.log(jobsDetails)
function getJobDitalis(api, key, callback) {
    const profile = new Profile(api);
    profile.getSpecific(key, (error, data) => {
        callback(error, data);
    });
}
...
(async ()=> {
let jobDetails = [];
for (let valueKeys of Object.values(arrayOfJobs)) {
const profile = await new Promise(resolve=>{
    getJobDitalis(api, valueKeys, (error, data) => {
        console.log(data.profile)
        resolve(data.profile);
    });
  })
 jobDetails.push(profile)
}
 console.log(jobDetails); 
 //do your task with jobDetails
})()