Dojo/request 尽管有要求,但仍未定义

Dojo/request undefined despite require

在与 Orchard 视图关联的脚本中,我尝试 post 一个 AJAX 到具有 dojo.request.post 函数的服务器。但是,我只得到 esri/requestdojo/request 是未定义的。我在 require 语句所在的函数外调用请求,但只要我以正确的格式使用它们,其他所需的包就没有问题。 Dojo/request 在我们的另一个项目中工作,所以我怀疑 Orchard 搞砸了(另一个项目的 dojo/request 使用是在一个普通页面中,而不是在视图中),尽管我预计它会导致问题更早浮出水面。

代码的重要部分:

require([ ... "dojo/request", ... ], function (... Request, ...) {
  //custom init function contents
})

function sendResults(featureSet) {
  //custom code processing the parameter, making uri, JSON and like
  dojo.request.post(uri, {
    //sending data
  })
}

我的剃须刀要求同一文件中的部分包含:

Script.Require("esri/JavaScriptApi").AtHead();
Script.Require("dojo").AtHead();

那些定义在resourcemanifest.cs:

 manifest.DefineScript("esri/JavaScriptApi").SetUrl("http://js.arcgis.com/3.14/");
 manifest.DefineScript("dojo").SetUrl("//ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js");

我尝试 运行 代码时遇到的错误:

TypeError: dojo.request is undefined

我在FireBug测试过,确认dojo/request不存在(变体也一样,比如dojo/Request),只有esri/request是一个函数,但它没有 post 方法。

我被困在这里了。 Google 搜索导致 "plains of sheer desperation"(第 5 页以上)没有有用的输出,我的同事也不知道。有谁知道为什么我看不到 dojo/request 以及如何获取它?

据我所知,dojo/request 不会导出全局变量(因为现代 AMD 模块通常不需要),因此 dojo.request 永远不会在任何上下文中工作。

使用 AMD 模块的正确方法是在 回调的主体中使用它们(或者,更好的是,在 AMD 模块中组织您自己的代码以及,并在 define 工厂函数中使用它们。

require([ ... "dojo/request", ... ], function (... request, ...) {
  request.post(...);
})

或者,如果您确定 dojo/request 在您要使用它时已经加载,您可以使用单参数 require 来引用它:

require('dojo/request').post(...);

但是,这通常并不理想,并且被视为黑客攻击。

也许 Introduction to AMD Modules 教程有助于更好地理解 AMD 的最佳用法。