Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.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
Javascript 在promise中使用async、double-then()的正确方法?node8,真的需要babel到es5吗?_Javascript_Node.js_Async Await_Es6 Promise_Babeljs - Fatal编程技术网

Javascript 在promise中使用async、double-then()的正确方法?node8,真的需要babel到es5吗?

Javascript 在promise中使用async、double-then()的正确方法?node8,真的需要babel到es5吗?,javascript,node.js,async-await,es6-promise,babeljs,Javascript,Node.js,Async Await,Es6 Promise,Babeljs,更新: 关于控制台字符串化的问题是重复的;所以我用async把我的问题换成了另一个问题,因为是sam ecode 我有一个异步函数,可以通过sequelize orm获取记录,为什么 我的问题是 const genericResolver = async ( table, action , values ) => { resultValues = {}; let resultValues = await models[table].findById(values.id

更新:

关于控制台字符串化的问题是重复的;所以我用async把我的问题换成了另一个问题,因为是sam ecode

我有一个异步函数,可以通过sequelize orm获取记录,为什么

我的问题是

const genericResolver = async ( table, action , values ) => {

    resultValues = {};
    let resultValues =   await models[table].findById(values.id).then( function (data) {
      console.log(' ************** data');
      console.log(data);
      return data;
    }).then( function (data2) {
       console.log(' ************** data 2');
       console.log(data2);
      }
    );
    console.log('------ resultValues');
    console.log(resultValues );
    process.exit(1);

for data and data2 I get:

    tour {
      dataValues: 
       { id: 'd61802ff-3eec-4a72-97ca-832f51b96bf0',
         name: 'Chipre 2018',
         price: '1400.00',
         createdAt: 2017-09-05T04:01:27.642Z,
         updatedAt: 2017-10-31T11:29:39.484Z },
      _previousDataValues: 
       { id: 'd61802ff-3eec-4a72-97ca-832f51b96bf0',
         name: 'Chipre 2018',
         price: '1400.00',
         createdAt: 2017-09-05T04:01:27.642Z,
         updatedAt: 2017-10-31T11:29:39.484Z },
      _changed: {},
      _modelOptions: 
       { timestamps: true,
         validate: {},
         freezeTableName: true,
         underscored: false,
         underscoredAll: false,
         paranoid: false,
         rejectOnEmpty: false,
         whereCollection: { id: 'd61802ff-3eec-4a72-97ca-832f51b96bf0' },
         schema: null,
         schemaDelimiter: '',
         defaultScope: {},
         scopes: [],
         hooks: {},
         indexes: [],
         name: { plural: 'tour', singular: 'tour' },
         omitNull: false,
         sequelize: 
          Sequelize {
            options: [Object],
            config: [Object],
            dialect: [Object],
            queryInterface: [Object],
            models: [Object],
            modelManager: [Object],
            connectionManager: [Object],
            importCache: {},
            test: [Object] },
         uniqueKeys: {} },
      _options: 
       { isNewRecord: false,
         _schema: null,
         _schemaDelimiter: '',
         raw: true,
         attributes: 
          [ 'id',
            'name',
            'price',
            'seatsmax',
            'createdAt',
            'updatedAt' ] },
      __eagerlyLoadedAssociations: [],
      isNewRecord: false }
但对于“结果值”,我得到:

undefined
我使用async做得对吗?我用的是node8,所以理论上我不需要babel把所有东西都转换成ES5?只是进口还是出口?我怀疑巴贝尔正在创建ES6代码

这里是我的package.json

{
  "name": "myproj",
  "version": "1.0.0",
  "description": "GraphQL server",
  "main": "server.js",
  "scripts": {
    "start": "nodemon ./server.js --exec babel-node -e js",
    "test": "eslint . --ext .js --ext .jsx --ignore-path .gitignore --cache"
  },
  "author": "",
  "license": "MIT",
  "devDependencies": {
    "babel-cli": "^6.24.0",
    "babel-eslint": "^8.0.0",
    "babel-preset-es2015": "^6.24.0",
    "babel-preset-stage-0": "^6.22.0",
    "eslint": "^4.7.1",
    "eslint-plugin-react": "^7.3.0",
    "nodemon": "^1.11.0"
  },
  "dependencies": {
    "bcrypt-nodejs": "0.0.3",
    "body-parser": "^1.17.1",
    "cors": "^2.8.3",
    "dotenv": "^4.0.0",
    "express": "^4.15.2",
    "graphql": "^0.9.1",
    "graphql-server-express": "^0.6.0",
    "graphql-tools": "^0.10.1",
    "jsonwebtoken": "^7.2.1",
    "lodash": "^4.17.4",
    "passport": "^0.4.0",
    "passport-jwt": "^3.0.0",
    "pg": "^7.2.0",
    "sequelize": "",
    "validator": "^6.2.0"
  }
}

这是因为对象在JS中作为引用传递,所以当您执行
console.log(o)
,您将在console中看到实际值(而不是调用
console.log
时传递给它的值)

当您使用
JSON.stringify
时,您正在记录字符串,该字符串通过值传递。因此,基本上当您使用JSON时,您将在调用
console.log
时看到该值

编辑

至于您的新问题,问题是您没有从第二次
然后
回调返回
data2
。使用
async/await
时,您根本不需要使用
then

const data = await models[table].findById(values.id);
或者,如果需要,只需返回
data2
,您就会在
resultValues
中看到相同的结果:

let resultValues = await models[table].findById(values.id).then(data => {
    console.log(' ************** data');
    console.log(data);
    return data;
}).then(data2 => {
    console.log(' ************** data 2');
    console.log(data2);

    return data2; // <== return here
});

console.log('------ resultValues');
console.log(resultValues );
let resultValues=wait models[table]。findById(values.id)。然后(data=>{
console.log(“****************数据”);
控制台日志(数据);
返回数据;
})。然后(数据2=>{
console.log('****************数据2');
console.log(data2);

返回数据2;//这是因为对象在JS中作为引用传递,所以当您执行
console.log(o)
时,您将在console中看到实际值(而不是调用
console.log
时传递给它的值)

当您使用
JSON.stringify
时,您正在记录字符串,它是通过值传递的。因此,基本上当您使用JSON时,您将在调用
console.log
时看到值

编辑

至于您的新问题,问题是您不需要从第二次
然后
回调返回
data2
。使用
async/wait
时,您根本不需要使用
然后

const data = await models[table].findById(values.id);
或者,如果需要,只需返回
data2
,您就会在
resultValues
中看到相同的结果:

let resultValues = await models[table].findById(values.id).then(data => {
    console.log(' ************** data');
    console.log(data);
    return data;
}).then(data2 => {
    console.log(' ************** data 2');
    console.log(data2);

    return data2; // <== return here
});

console.log('------ resultValues');
console.log(resultValues );
let resultValues=wait models[table]。findById(values.id)。然后(data=>{
console.log(“****************数据”);
控制台日志(数据);
返回数据;
})。然后(数据2=>{
console.log('****************数据2');
console.log(data2);

return data2;//real is console.log(o)的可能副本的可能副本那么?有一种方法可以通过一种技术获得相同的值?我不明白stringfy中的值是从哪里来的?我想我没有更改该值。不,只有在使用JSON时才保留实际值。问题不在于
console.log
,而在于您的代码-当re尚未分配。您可能稍后才分配它们(这可能发生在与您正在使用的文件不同的位置)。抱歉,thahks,但我的问题被标记为重复,因此建议我更改我看到的问题。
resultvalue
未定义的问题是,您没有从第二次
回调返回
数据,然后返回
回调。真正的问题是console.log(o)那么?有一种方法可以通过一种技术获得相同的值?我不明白stringfy中的值是从哪里来的?我想我没有更改该值。不,只有在使用JSON时才保留实际值。问题不在于
console.log
,而在于您的代码-当re尚未分配。您可能稍后才分配它们(这可能发生在与您正在使用的文件不同的位置)。抱歉,thahks,但我的问题被标记为重复,因此建议我更改我看到的问题。
resultvalue
未定义的问题在于,您没有从第二次
回调返回
数据。