Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/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
最佳实践:Javascript类依赖于异步获取外部数据_Javascript_Node.js_Express_Asynchronous - Fatal编程技术网

最佳实践:Javascript类依赖于异步获取外部数据

最佳实践:Javascript类依赖于异步获取外部数据,javascript,node.js,express,asynchronous,Javascript,Node.js,Express,Asynchronous,我的javascript技能有点过时,所以我想咨询您的最佳实践建议 我想要达到的目标: 创建一个类,该类围绕从外部服务获取的JSON进行包装 创建另一个类,作为封装所有网络内容的前一个类的工厂 了解在这种情况下如何处理承诺 这是一份草稿: class DataObject { constructor(json) {...} someMethod() {...} } class DataObjectFactory { constructor() {...} getDataOb

我的javascript技能有点过时,所以我想咨询您的最佳实践建议

我想要达到的目标:

  • 创建一个类,该类围绕从外部服务获取的JSON进行包装
  • 创建另一个类,作为封装所有网络内容的前一个类的工厂
  • 了解在这种情况下如何处理承诺
这是一份草稿:

class DataObject {
  constructor(json) {...}
  someMethod() {...}
}

class DataObjectFactory {
  constructor() {...}
  getDataObject(id) {
     ..fetch(url)..
  }
}

myDataObjectFactory.getDataObject(123).then(...)
现在,我可以强制
getDataObject()
进行同步操作,但我想了解在这种情况下使用承诺的最佳方式是什么。为了确保DataObject成功地填充了JSON数据,我必须如何组织和编写我的资料

也欢迎链接到有用的howto


谢谢大家!

如果您想直接使用承诺,您可以让getDataObject()返回在解决fetch后解析的承诺。 调用getDataObject().then()时,给出函数或lambda表达式的下一步操作

class DataObjectFactory {
  constructor() {...}
  
  getDataObject(id) {
    let getDataObjectPromise = new Promise(function(resoveFn) {
        fetch(url).then(
            resoveFn(
                DataObject(response)
            )
        );
    });
    return getDataObjectPromise;
  }
}


function useDataObject(newDataObject){
    // there you can use DataObject
}

myDataObjectFactory.getDataObject(123).then(useDataObject); //use function or lambda expression
如果您想使用自然外观的语法,可以使用async/await,它在surface下使用promise

class DataObjectFactory {
  constructor() {...}
  async getDataObject(id) {
     let json = await fetch(url);
     return DataObject(json);
  }
}

async function getAndUseDataObject(){
    var myDataObject = await myDataObjectFactory.getDataObject(123);
    // use myDataObject like in sync function
}

getAndUseDataObject(); //One can't use await outside async function

对于
fetch
及其方法已经提供的功能,实际上没有什么可添加的。但它可能看起来像下面。此代码段使用JSONPlaceholder获取一些数据:

类数据对象{
建造师(obj){
分配(本,obj);
}
toString(){
返回'User${this.userId}${this.completed?'completed:“尚未完成”}任务号${this.id},标记为${this.title}`;
}
}
类DataObjectFactory{
构造函数(){
}
异步getDataObject(id){
let response=等待获取(“https://jsonplaceholder.typicode.com/todos/“+id);
让obj=wait response.json();
返回新的数据对象(obj);
}
}
让myDataObjectFactory=newDataObjectFactory();
getDataObject(123)。然后(myDataObject=>
console.log(myDataObject.toString())

);欢迎来到S.O!是myDataObjectFactory.getDataObject(123)的结果。然后(…)
DataObject
使用?谢谢!否,它应该生成并返回您正在使用的数据对象(1)。(2) 响应对象与JSON关系不大。