forcejs, 在JavaScript应用中,使用 Salesforce REST api的微型库

分享于 

31分钟阅读

GitHub

  繁體 雙語
Micro library to use the Salesforce REST APIs in JavaScript Apps
  • 源代码名称:forcejs
  • 源代码网址:http://www.github.com/ccoenraets/forcejs
  • forcejs源代码文档
  • forcejs源代码下载
  • Git URL:
    git://www.github.com/ccoenraets/forcejs.git
    Git Clone代码到本地:
    git clone http://www.github.com/ccoenraets/forcejs
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/ccoenraets/forcejs
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    用于 Salesforce api的 ForceJS JavaScript工具包

    ForceJS是一个微型库,它使得在JavaScript应用程序中使用 Salesforce REST api变得容易。 通过使用 OAuth,ForceJS可以轻松地使用OAuth进行认证,并且可以使用简单的API操作Salesforce数据。

    ForceJS的主要目标是:

    • 部署在你自己服务器上的客户端JavaScript应用程序( Heroku或者其他服务器)
    • 使用 Apache Cordova和Salesforce移动SDK构建的混合移动应用

    部署 inside 实例( Visualforce页或者闪电组件)的应用程序可以使用一个数据访问实用程序中构建的数据访问实用程序: JavaScript远程处理。远程对象。闪电数据服务等。

    基于 ECMAScript 6

    现代JavaScript应用程序现在使用 ECMAScript 6 ( 又名 ECMAScript 2015 ) 和。 当前版本的框架( 例如React,Angular 2和ionic 2 ) 也构建在 ECMAScript 6之上,更甚于。 现在我们已经在 ECMAScript 6之上构建了 ForceJS,以支持现代应用程序开发,并与这些框架很好地集成。

    与 ECMAScript 5兼容

    ECMAScript 6源文件被编译为兼容的ECMAScript 5版本。 dist 5兼容文件在目录中可以用。 ECMAScript 5文件支持通用 MODULE 定义( UMD ) 格式。 换句话说,它们可以与AMD或者 CommonJS MODULE 加载器一起使用,也可以使用 force.OAuthforce.DataService 变量。

    原来的ECMAScript版本仍然可以在这个存储库的分支中获得。 es5分支不再主动地发展。

    关键特性

    • 无相关性
    • 加载为 ECMAScript 6模块
    • 异步调用返回 ECMAScript 6承诺
    • 完整的OAuth登录工作流( User Agent )
    • 使用Salesforce移动 SDK OAuth插件在浏览器和Cordova中透明工作
    • 到期时自动刷新 OAuth access_token ( 如果可用的话)
    • 强制服务器紧密集成,本地开发服务器作为代理和本地web服务器,提供简化的开发人员体验。
    • 用于操作数据的简单 API ( 创建。更新。delete。更新
    • 支持在同一应用程序中连接到多个Salesforce实例
    • 适用于现代的JavaScript框架: React,Angular 2,ionic 2等。

    模块

    ForceJS是建立在模块化架构之上的。 它目前包括两个模块:

    • 费费的/OAuth: 使用 OAuth User Agent 工作流方便地通过Salesforce进行身份验证的一个 MODULE
    • forcejs/数据服务: 通过 Salesforce api方便地访问数据的MODULE

    在应用程序中通常一起使用 forcejs/oauthforcejs/data-service,但可以单独使用它们。 例如如果你需要的是Salesforce访问令牌(。Lightning使用案例),你可以自行使用/oauth。 和其他的一样,如果你已经拥有一个访问令牌,那么你可以自己使用/数据服务,并且你所需要的是一个简单的。

    浏览器和Cordova抽象

    ForceJS可以用来开发基于浏览器的应用或者混合移动应用,使用Salesforce移动SDK和 Apache Cordova。 在应用程序中开发一个混合应用程序时,通常在浏览器和设备上运行该应用程序时,你会经常来回运行。 在浏览器中开发通常更快,更容易调试,但是你仍需要测试设备特定的功能。 问题在于,在浏览器和设备中运行OAuth和REST的配置是不同的。 以下是主要差异的摘要:

    浏览器移动 SDK
    需要代理是( * )不是
    OAuth窗口弹出式菜单OAuth插件

    ( * ) 从 spring 15发行版开始,一些 Salesforce REST api ( 比如聊天和 sobjects ) 支持 CORS。 要允许应用程序直接对你的组织进行REST调用,请在安装程序中 register: 管理> 安全控制> CORS。

    ForceJS抽象这些差异,允许你在浏览器和设备上运行你的应用程序,无需代码或者配置更改。

    ECMAScript 6用法

    import {OAuth, DataService} from'forcejs';let oauth =OAuth.createInstance();oauth.login().then(oauthResult=>DataService.createInstance(oauthResult));letloadContacts= () => {
     let service =DataService.getInstance();
     service.query('select id, Name from contact LIMIT 50')
    . then(response=> {
     let contacts =response.records;
     // do something with contacts });
    }

    如果只使用forcejs子模块( oauth或者数据),建议以下导入语法确保编译后的版本不包括不支持树振动的MODULE:

    importOAuthfrom'forcejs/oauth';//orimportDataServicefrom'forcejs/data-service';

    由于当前浏览器还不支持所有 ECMAScript 6功能,因此需要使用构建工具将ECMAScript代码编译为 ECMAScript 5兼容代码,并提供 MODULE 加载基础架构。 web pack。Browserify和Rollup是流行的选项。 web pack指令在快速开始节 below 中提供。 类似React。Angular 2和ionic 2的框架已经存在于构建过程中。 如果你使用这些框架,不需要额外的步骤。

    ECMAScript 5用法

    使用 dist 目录中可用的ECMAScript 5兼容文件。

    <scriptsrc="force.all.js"></script>
    <script>var oauth =force.OAuth.createInstance();oauth.login().then(function(oauthResult) {force.DataService.createInstance(oauthResult);  });functionloadContacts() {var service =force.DataService.getInstance();service.query('select id, Name from contact LIMIT 50'). then(function(response) {var contacts =response.records;// do something with contacts }); }</script>

    如果只使用forcejs模块( oauth或者数据) 之一,建议以下语法避免包含不使用的模块:

    <scriptsrc="force.oauth.js"></script>
    //or
    <scriptsrc="force.data-service.js"></script>
    var oauth = force.OAuth.createInstance();
    //or
    var service = force.DataService.createInstance(oauthResult);

    快速启动 1: 简单浏览器应用程序

    为此项目创建一个新目录,导航到该目录,然后键入以下命令来初始化使用 npm包管理器( 接受所有默认值)的项目:

     
    npm init
    
    
    
     

    键入以下命令以安装 forcejs:

    
    npm install forcejs --save-dev
    
    
    
    

    键入以下命令以安装服务器开发服务器:

    
    npm install force-server --save-dev
    
    
    
    

    键入以下命令以安装收费 Webpack Webpack: Babel:

    
    npm install babel-core babel-loader babel-preset-es2015 webpack --save-dev
    
    
    
    

    使用你喜爱的编辑器,打开 package.json 并修改 scripts 部分,如下所示:

    
    "scripts": {
    
    
    "webpack":"webpack",
    
    
    "start":"force-server"
    
    
    },
    
    
    
    

    在项目目录的root 中,创建一个名为 webpack.config.js的文件:

    
    var path = require('path');
    
    
    var webpack = require('webpack');
    
    
    
    module.exports = {
    
    
     entry: './app.js',
    
    
     output: {
    
    
     filename: 'app.bundle.js'
    
    
     },
    
    
     module: {
    
    
     loaders: [
    
    
     {
    
    
     test:/.js$/,
    
    
     loader: 'babel-loader',
    
    
     query: {
    
    
     presets: ['es2015']
    
    
     }
    
    
     }
    
    
     ]
    
    
     },
    
    
     stats: {
    
    
     colors: true
    
    
     },
    
    
     devtool: 'source-map'
    
    
    };
    
    
    
    

    在项目目录的root 中,创建一个名为 index.html的文件:

    
    <!DOCTYPE html>
    
    
    <html>
    
    
    <body>
    
    
     <h1>Forcejs Quick Start</h1>
    
    
     <ul id="contacts"></ul>
    
    
     <script src="app.bundle.js"></script>
    
    
    </body>
    
    
    </html>
    
    
    
    

    在项目目录的root 中,创建一个名为 app.js的文件:

    
    import {OAuth, DataService} from 'forcejs';
    
    
    
    let oauth = OAuth.createInstance();
    
    
    oauth.login()
    
    
    . then(oauthResult => {
    
    
     DataService.createInstance(oauthResult);
    
    
     loadContacts();
    
    
     });
    
    
    
    let loadContacts = () => {
    
    
     let service = DataService.getInstance();
    
    
     service.query('select id, Name from contact LIMIT 50')
    
    
    . then(response => {
    
    
     let contacts = response.records;
    
    
     let html = '';
    
    
     contacts.forEach(contact => html = html + `<li>${contact.Name}</li>`);
    
    
     document.getElementById("contacts").innerHTML = html;
    
    
     });
    
    
    }
    
    
    
    

    在 命令行 上,键入以下命令以生成项目:

     
    npm run webpack
    
    
    
     

    键入以下命令以在浏览器中启动该应用程序:

     
    npm start
    
    
    
     

    快速启动 2: Cordova和移动SDK的混合移动应用

    安装Cordova和Salesforce移动SDK为你所选择的平台。 例如对于 iOS:

    
    npm install -g cordova forceios
    
    
    
    

    在Mac上,你可能必须使用 sudo:

    
    sudo npm install -g cordova forceios
    
    
    
    

    创建一个新的移动应用程序:

     
    forceios create
    
    
    
     

    按如下方式回答提示( 根据需要调整公司id和组织 NAME ):

    
    Enter your application type (native, hybrid_remote, or hybrid_local): hybrid_local
    
    
    Enter your application name: myforcejsapp
    
    
    Enter the output directory for your app (defaults to the current directory):
    
    
    Enter your company identifier (com.mycompany): com.mycompany.myforcejsapp
    
    
    Enter your organization name (Acme, Inc.): MyCompany, Inc.
    
    
    Enter your Connected App ID (defaults to the sample app's ID):
    
    
    Enter your Connected App Callback URI (defaults to the sample app's URI):
    
    
    
    

    将( 光盘) 导航到项目目录:

     
    cd myforcejsapp
    
    
    
     

    键入以下命令以初始化使用 npm 软件包管理器( 接受所有默认值)的项目:

     
    npm init
    
    
    
     

    键入以下命令以安装 forcejs:

    
    npm install forcejs --save-dev
    
    
    
    

    键入以下命令以安装服务器开发服务器:

    
    npm install force-server --save-dev
    
    
    
    

    键入以下命令以安装收费 Webpack Webpack: Babel:

    
    npm install babel-core babel-loader babel-preset-es2015 webpack --save-dev
    
    
    
    

    使用你喜爱的编辑器,打开 package.json 并修改 scripts 部分,如下所示:

    
    "scripts": {
    
    
    "webpack":"webpack",
    
    
    "start":"force-server --root www"
    
    
    },
    
    
    
    

    在项目目录的root 中,创建一个名为 webpack.config.js的文件:

    
    var path = require('path');
    
    
    var webpack = require('webpack');
    
    
    
    module.exports = {
    
    
     entry: './app/app.js',
    
    
     output: {
    
    
     path: path.resolve(__dirname, 'www'),
    
    
     filename: 'app.bundle.js'
    
    
     },
    
    
     module: {
    
    
     loaders: [
    
    
     {
    
    
     test:/.js$/,
    
    
     loader: 'babel-loader',
    
    
     query: {
    
    
     presets: ['es2015']
    
    
     }
    
    
     }
    
    
     ]
    
    
     },
    
    
     stats: {
    
    
     colors: true
    
    
     },
    
    
     devtool: 'source-map'
    
    
    };
    
    
    
    

    在项目目录的root 中,创建一个名为 app的目录

    app 目录中,创建一个名为 app.js的文件:

    
    import {OAuth, DataService} from 'forcejs';
    
    
    
    let oauth = OAuth.createInstance();
    
    
    oauth.login()
    
    
    . then(oauthResult => {
    
    
     DataService.createInstance(oauthResult);
    
    
     loadContacts();
    
    
     });
    
    
    
    let loadContacts = () => {
    
    
     let service = DataService.getInstance();
    
    
     service.query('select id, Name from contact LIMIT 50')
    
    
    . then(response => {
    
    
     let contacts = response.records;
    
    
     let html = '';
    
    
     contacts.forEach(contact => html = html + `<li>${contact.Name}</li>`);
    
    
     document.getElementById("contacts").innerHTML = html;
    
    
     });
    
    
    }
    
    
    
    

    www 目录中,delete 除 bootconfig.jsonindex.html 之外的所有文件和目录

    打开 index.html。将内容替换为:

    
    <!DOCTYPE html>
    
    
    <html>
    
    
    <body>
    
    
     <h1>Forcejs App</h1>
    
    
     <ul id="contacts"></ul>
    
    
     <script src="cordova.js"></script>
    
    
     <script src="app.bundle.js"></script>
    
    
    </body>
    
    
    </html>
    
    
    
    

    在 命令行 上,键入以下命令以生成项目:

     
    npm run webpack
    
    
    
     

    键入以下命令在浏览器中运行该应用程序:

     
    npm start
    
    
    
     

    在Mac上,键入以下命令以构建iOS的应用程序:

    
    cordova build ios
    
    
    
    

    在你的iOS设备上运行该应用程序:

    • 打开"%s" platforms/ios/myforcejsapp.xcodeproj 在Xcode中
    • 在左侧工具条中单击 myforcejsapp
    • Signing 部分中,选择与有效证书对应的组
    • 单击工具栏中的运行按钮以在设备上运行应用程序。

    API参考

    forcejs/oauth

    基本用法:

    
    import OAuth from"forcejs/oauth";
    
    
    let oauth = OAuth.createInstance();
    
    
    oauth.login().then(result => {
    
    
     console.log(result);//Prints access token, instance URL, and refresh token (if any)
    
    
    });
    
    
    
    
    ),) ( appId,loginURL,oauthCallbackURL )登录( )

    当在浏览器中运行时使用弹出窗口启动 User Agent OAuth工作流,或者在Cordova运行时使用OAuth插件。

    • 返回值: 承诺。 在解析时,将提供具有以下字段的对象: appId,accessToken,instanceURL,refreshToken和用户标识。

    forcejs/数据服务

    基本用法:

    
    import Oauth from"forcejs/oauth";
    
    
    import Service from"forcejs/data-service";
    
    
    let oauth = OAuth.createInstance();
    
    
    oauth.login().then(oauthResult => {
    
    
     Service.createInstance(oauthResult);
    
    
    });
    
    
    
    
    createInstance ( oauth,选项,名称)
    • oauth。require。一个带有以下字段的对象:

      • accessToken

        经过身份验证的访问令牌

        必需,无默认值

      • instanceURL

        Salesforce实例 URL

        必需,无默认值

      • refreshToken

        刷新令牌

        可选,无默认值

    • 选项。可选。具有以下字段的对象:

      • useProxy

        默认情况下,ForceJS将自动确定是否需要使用CORS代理: 如果应用程序运行 inside 一个Visualforce页面或者一个in应用程序,它将不会使用代理。 你可以强制ForceJS通过将这里值设置为 true 来始终使用代理。

        从 spring 15发行版开始,一些 Salesforce REST api ( 比如聊天和 sobjects ) 支持 CORS。 要允许应用程序直接对你的组织进行REST调用,请在安装程序中 register: 管理> 安全控制> CORS。 如果你对域进行白名单并使用支持CORS的api,则可以将useProxy设置为 false。

        Optional: 如果应用程序运行在Cordova或者Visualforce页面中,则为 ,如果该应用程序不是 Cordova,则为 true。

      • proxyURL

        CORS代理服务器的URL。 当应用程序在Cordova或者 inside 中运行时,这个参数被忽略。

        可选。默认值:应用程序加载的基本 URL。 例如如果从 http://localhost:8200 加载应用程序,默认的proxyURL是 http://localhost:8200. 如果从 https://myserver.com/myapp 加载该应用程序,默认的proxyURL是 https://myserver.com/myapp。

      • apiVersion

        Salesforce API的版本。

        可选。默认值:v36.0

    • 默认情况下,createInstance() 创建一个单独的实例,这是你的应用程序与单个Salesforce组织一起工作时所需要的。 如果你构建连接多个Salesforce实例的应用程序,请提供一个 NAME 来标识实例。 例如:

      
      createInstance(oauth, options,"sales");
      
      
      
      

      以后可以使用以下方法检索特定的实例:

      
      getInstance("sales");
      
      
      
      

      可选默认值:无如果未提供 NAME,则创建单个实例。 如果提供了 NAME,则提供命名实例。

    的getInstance ( 名称)
    • 要检索的实例的NAME。

      可选如果省略,则返回单个实例。 如果指定,则返回命名实例。

    ( )
    • 返回值: 经过身份验证的用户的id。
    查询( soql )

    用于执行SOQL语句

    • :SOQL语句

    • 按批次收费:保存批量调用的查询- 在 . batch() see查看更多信息

    • 返回值: 承诺

    例如:

    
    service.query("SELECT id, name FROM contact")
    
    
    . then(result => {
    
    
     console.log(result.records);
    
    
     })
    
    
    . catch(error => {
    
    
     console.log(error);
    
    
     });
    
    
    
    
    创建( objectName,valueObject )

    用于为Salesforce对象创建记录

    • objectName。
    • valueObject。需要。
    • 按批次收费:保存批量调用的查询- 在 . batch() see查看更多信息
    • 返回值: 承诺。 在解析promise时,将提供具有以下字段的对象:
      • 错误: 错误的array ( 如果有)
      • id: 创建的记录的记录 id
      • 成功: true 或者 false

    例如:

    
    service.create('contact', {FirstName:"Lisa", LastName:"Jones"})
    
    
    . then(response => {
    
    
     console.log(response);
    
    
     })
    
    
    . catch(error => {
    
    
     console.log(error);
    
    
     });
    
    
    
    
    更新( objectName,valueObject )

    用于更新记录

    • objectName。

    • valueObject。必须包含和Id字段以标识要更新的记录。

    • 按批次收费:保存批量调用的查询- 在 . batch() see查看更多信息

    • 方法。可选的post/patch

    • 返回值: 承诺

    例如:

    
    service.update('contact', {Id:"0031a000001x7DOAAY", FirstName:"Emma", LastName:"Wong"})
    
    
    . then() => {
    
    
     console.log("Update successful");
    
    
     })
    
    
    . catch(error => {
    
    
     console.log(error);
    
    
     });
    
    
    
    
    ( objectName,recordId )

    用于 delete 记录

    • objectName。

    • recordId。需要。

    • 按批次收费:保存批量调用的查询- 在 . batch() see查看更多信息

    • 返回值: 承诺

    例如:

    
    service.del('contact',"0031a000001x7DOAAY",
    
    
    . then() => {
    
    
     console.log("Delete successful");
    
    
     })
    
    
    . catch(error => {
    
    
     console.log(error);
    
    
     });
    
    
    
    
    ( objectName,externalIdField,externalId,数据)

    用于更新记录

    例如:

    
    service.upsert('contact', 'My_Contact_Id__c', '101', {FirstName:"Emma", LastName:"Wong"})
    
    
    . then() => {
    
    
     console.log("Upsert successful");
    
    
     })
    
    
    . catch(error => {
    
    
     console.log(error);
    
    
     });
    
    
    
    
    检索( objectName,recordId,字段)

    用于检索单个记录

    • objectName。

    • recordId。需要。

    • 字段。可选。要检索的字段的array。 如果省略,则检索所有可用字段。

    • 按批次收费:保存批量调用的查询- 在 . batch() see查看更多信息

    • 返回值: 承诺

    例如:

    
    service.retrieve('contact', id)
    
    
    . then(contact => {
    
    
     console.log(contact);
    
    
     })
    
    
    . catch(error => {
    
    
     console.log(error);
    
    
     });
    
    
    
    
    报告( recordId )

    用于返回报表

    • recordId。如果为空,则返回所有已经创建的报告。

    • 按批次收费:保存批量调用的查询- 在 . batch() see查看更多信息

    • 返回值: 承诺

    例如:

    
    service.reports()
    
    
    . then(contact => {
    
    
     console.log(reports);
    
    
     })
    
    
    . catch(error => {
    
    
     console.log(error);
    
    
     });
    
    
    
    
    dasboard ( recordId )

    用于返回仪表板

    • recordId。如果为空,则返回所有已经创建的指示板。

    • 按批次收费:保存批量调用的查询- 在 . batch() see查看更多信息

    • 返回值: 承诺

    例如:

    
    service.dashboard()
    
    
    . then(contact => {
    
    
     console.log(reports);
    
    
     })
    
    
    . catch(error => {
    
    
     console.log(error);
    
    
     });
    
    
    
    
    apexrest ( urlMapping )

    用于调用由你自己的Apex类实现的自定义REST服务端点。

    • Apex类中的urlMapping注释的 require需要。

    • 返回值: 承诺

    例如:

    
    force.apexrest("contacts")
    
    
    . then(result => {
    
    
     console.log(result)
    
    
     })
    
    
    . catch(error => {
    
    
     console.log(error);
    
    
     });
    
    
    
    
    请求请求请求( obj )

    调用REST服务的核心方法。 其他函数( 查询,创建,更新,del,更新,apexrest ) 只是调用 request() behind的便捷函数。 可以直接使用 request() 调用其他REST服务,这些服务不是通过方便函数直接公开的。

    例如:

    
    force.request({path:"/services/data-service"})
    
    
    . then(result => {
    
    
     console.log(result)
    
    
     })
    
    
    . catch(error => {
    
    
     console.log(error);
    
    
     });
    
    
    
    

    参数:

    • 路径

      要调用的服务的路径

    • 方法

      要执行的HTTP方法: 获取,张贴,放置,DELETE,修补程序

      默认: 获取

    • contentType

      请求内容类型。

    • params

      将被转换为追加到请求URL的查询字符串的对象

    • 数据

      表示要作为请求主体发送的数据的对象。

    聊天( obj )

    使用 Chatter API的便利函数

    例如:

    
    force.chatter({path:"/users/me"})
    
    
    . then(result => {
    
    
     console.log(result)
    
    
     })
    
    
    . catch(error => {
    
    
     console.log(error);
    
    
     });
    
    
    
    

    参数:

    • 路径

      调用的Chatter服务的路径

    • 方法

      要执行的HTTP方法: 获取,张贴,放置,DELETE,修补程序

      默认: 获取

    • contentType

      请求内容类型。

    • params

      将被转换为追加到请求URL的查询字符串的对象

    • 数据

      表示要作为请求主体发送的数据的对象。

    版本( )

    列出每个 Salesforce.com 版本的摘要信息,包括版本。标签和每个版本的root的链接。

    资源( )

    列出客户端版本的API的可用资源,包括资源 NAME 和 URI。

    describeGlobal ( )

    列出组织数据的可用对象及其元数据。

    元数据( objectName )

    描述指定对象的单个元数据。

    • objectName对象 比如""
    • 按批次收费:保存批量调用的查询- 在 . batch() see查看更多信息
    描述( objectName )

    完全描述指定对象的所有级别的单个元数据。

    • objectName: 对象,比如"帐户"
    • 按批次收费:保存批量调用的查询- 在 . batch() see查看更多信息
    describeLayout ( objectName,recordTypeId )

    获取特定 sobject NAME 和记录类型id的布局配置。

    • objectName: 对象,比如"帐户"
    • recordTypeId ( 可选): 布局记录类型关联的Id
    • 按批次收费:保存批量调用的查询- 在 . batch() see查看更多信息
    queryMore ( url )

    基于分页查询下一组记录。 如果执行检索超过可以按照 http://www.salesforce.com/us/developer/docs/api_rest/Content/dome_query.htm 语句返回的查询,则应使用这里方法。

    • url: 从nextRecordsUrl或者prevRecordsUrl检索的url
    • 按批次收费:保存批量调用的查询- 在 . batch() see查看更多信息
    全文搜索( SOSL )

    执行指定的SOSL搜索。

    • 包含要执行的搜索的字符串:比如 find find
    • 按批次收费:保存批量调用的查询- 在 . batch() see查看更多信息
    批处理( 请求)

    执行批处理批处理参数在其他调用类似查询中执行批处理,创建将保存对批处理的请求。 所以在执行这个函数之前你必须调用。 重要说明:在API版本 34.0和更高版本中,子请求可以调用限制。SObject。查询/queryall。搜索。连接和聊天资源。 API版本 35.0增加了使用操作资源的能力。

    • 请求:来自其他呼叫的承诺
    
    //don't do it in production with nested promises :) Chain it or use observals
    
    
     let query: string = 'SELECT id FROM Contact LIMIT 10';
    
    
     let query1: string = 'SELECT id FROM Contact LIMIT 20';
    
    
     let query2: string = 'SELECT id FROM Contact LIMIT 30';
    
    
    
     DataService.getInstance().query(query, true).then(q1 => {
    
    
     DataService.getInstance().query(query1, true).then(q2 => {
    
    
     DataService.getInstance().query(query2, true).then(q3 => {
    
    
     DataService.getInstance().batch([q1, q2, q3]).then((response) => {
    
    
     console.log(q1, q2, q3);
    
    
     console.log(response);
    
    
     });
    
    
     });
    
    
     });
    
    
     });
    
    
    
    
    复合( 请求)
    • 请求:来自其他呼叫的承诺

    JAVA  Javascript  API  REST  micr  sal  
    相关文章